加载中…
个人资料
liht1634
liht1634
  • 博客等级:
  • 博客积分:0
  • 博客访问:223,741
  • 关注人气:58
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

线性表-顺序存储结构

(2017-01-15 16:43:48)
标签:

线性表之顺序存储结构

分类: 编程类

#include "stdio.h"
#include "stdlib.h"  //用到了srand函数,所以要有这个头文件

 

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20


typedef int ElemType; 
typedef int Status;   

 

typedef struct
{
 ElemType data[MAXSIZE];
 int length;           
}SqList;

 

//因为要初始化,要对线性表本身进行操作,所以不能用值传递。值传递不会改变实参的值嘛。

//地址传递的话呢,实际上在函数内部执行了这么一个操作:L = &L. 所以操作函数内部的L,

//也就相当于操作外部的线性表L。其实地址传递也是值传递。不过这个值是地址而已。

//也就是说,需要修改表的就传指针,不需要修改表的传值就行了。
Status InitList(SqList *L) //初始化线性表
{
    L->length=0;
    return OK;
}

 

SqList Create(SqList L) //顺序表的建立
{
    int i;
   
    srand((unsigned)time(NULL));
    for(i=0; i < 10; i++)
   {
        L.data[i] = rand ( ) % 100; //产生0-100随机数
        L.length++;
   }
    return L;
}

Status ClearList(SqList *L) //清除线性表
{
    L->length = 0;
    return OK;
}

Status visit(ElemType c) //访问线性表
{
    printf("%d ",c);
    return OK;
}

Status ListTraverse(SqList L) //遍历线性表
{
 int i;
    for(i=0;i < L.length;i++)
        visit(L.data[i]); //访问线性表
    printf("\n");
    return OK;
}

Status ListInsert(SqList *L,int i,ElemType e) //线性表插入
                //结构体指针 插入位置 ElemType=int插入的值
 int k;

 if (L->length==MAXSIZE)
  return ERROR;
 if (i < 1 || i>L->length+1)
  return ERROR;
  
 if (i <= L->length) //i带入插入位置
 {
  for(k=L->length-1;k>=i-1;k--) //遍历
       L->data[k+1]=L->data[k]; //往后移位
 }
 L->data[i-1]=e; //e带入插入的值
 L->length++; //线性表长度加1
   
 return OK;
}

Status ListDelete(SqList *L,int i,ElemType *e) //删除某个元素
                           //结构体指针 删除位置
    int k;
    if (L->length==0) 
        return ERROR;
    if (i < 1 || i>L->length) 
        return ERROR;


    *e=L->data[i-1]; //i删除位置(变量就是“.”指针就是“->”)
    if (i < L->length) 
    {
        for(k=i; k < L->length; k++)
            L->data[k-1]=L->data[k];
    }
    L->length--;//线性表长度减1
    return OK;
}

 

//首先参数,我们需要传入线性表L,仅仅查找的话是不需要对表进行变化的,所以用值传递就行。

//然后就是传入需要查找元素的位置 i,最后还需要一个参数 *e,这个需要用地址传递,

//因为要保存函数的查找结构。

Status GetElem(SqList L,int i,ElemType *e) //查找表中元素
{
    if(L.length==0 || i < 1 || i>L.length)
        return ERROR;


    *e=L.data[i-1];
    return OK;
}

int ListLength(SqList L) //线性表长度
{
    return L.length;
}

Status ListEmpty(SqList L) //线性表是否为空
{
    return (L.length == 0)? TRUE : FALSE;
}

int LocateElem(SqList L,ElemType e) //判断元素是否在表中
{
    int i;
    if (L.length==0)
        return 0;
    for(i=0;i < L.length;i++)
    {
        if (L.data[i]==e)
            break;
    }
    if(i>=L.length)
        return 0;
  
    return i+1;
}

int main(void)
{
    SqList L; ElemType e; Status i; int opp;
    int j,k;
    int pos;
    ElemType value;
  
    i=InitList(&L);//初始化线性表
    printf("初始化成功,L.length=%d\n",L.length);
    printf("\n1.遍历线性表 \n2.线性表赋值 \n3.清空线性表 \n4.线性表插入 \n5.查找表中元素 \n6.判断元素

   是否在表中\ \n7.删除某个元素 \n8.线性表长度\n9.线性表是否为空\n0.退出 \n请选择你的操作:\n");
    while(opp != 0)
   {
        scanf("%d",&opp);
        switch(opp)
        {
            case 1:
                ListTraverse(L); //遍历线性表
                printf("\n");
                break;
              
            case 2:
                L = Create(L);
                printf("创建随机链表:L.data="); //线性表赋值
                ListTraverse(L); //遍历线性表
                printf("\n");
                break;
              
            case 3:
                i=ClearList(&L);
                printf("清空L后:L.length=%d\n",L.length); //清空线性表
                ListTraverse(L); //遍历线性表
                printf("\n");
                break;
               
            case 4:
                printf("请输入插入元素位置:"); //线性表插入
                scanf("%d",&pos);
                printf("请输入插入元素的值:");
                scanf("%d",&value);
                i = ListInsert(&L,pos,value); //线性表插入
                printf("插入完毕,现在线性表为:\n");
                ListTraverse(L); //遍历线性表
                printf("\n");
                break;
              
            case 5:
                printf("你要查找第几个元素? "); //查找表中元素
                scanf("%d",&pos);
                GetElem(L,pos,&e); //查找表中元素
                printf("第%d个元素的值为:%d\n",pos,e);
                break;
              
            case 6:
                printf("输入你想知道是否在表中的数值: "); //判断元素是否在表中
                scanf("%d",&e);
                k=LocateElem(L,e); //判断元素是否在表中
                // 这里假定随机数组中的元素互不重复
                if(k)
                    printf("值为%d是表中的第%d个元素\n",e,k);
                else
                    printf("没有值为%d的元素\n",e);
                break;
              
            case 7:
                printf("要删除第几个元素?"); //删除某个元素
                scanf("%d",&pos);
                ListDelete(&L,pos,&e); //删除某个元素(实验时&e可以去掉)
                printf("删除完毕,现在线性表为:\n");
                ListTraverse(L); //遍历线性表
                printf("\n");
                break;
              
            case 8:
                k = ListLength(L); //线性表长度
                printf("线性表的长度为: %d \n", k);
                break;
              
            case 9:
                i = ListEmpty(L); //线性表是否为空
                if (i)
                    printf("该线性表为空.\n");
                else
                    printf("该线性表非空\n");
                break;
              
            case 0:
                exit(0); //退出
        }
    }
}

----------------------------------------------------------------------------------------------------------------

附录

1、参考:http://www.nowamagic.net/librarys/veda/detail/2198

----------------------------------------------------------------------------------------------------------------

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有