数据结构(顺序线性表___C语言代码实现)

一.准备工作做好:

对于需要建构顺序线性表的必备变量和结构体

  1. 状态量
  2. 内存大小量、内存增加量
  3. 重定义整形(int)类型变量
    #include
    #include
    #include 
    
    #define LIST_INIT_SIZE 10
    #define LIST_INCREAMENT 10
    #define ERROR -2
    #define OK 1
    #define TRUE 1
    #define FLASE 0
    #define OVERFLOW -1
    
    typedef int ElemType; 
    typedef int Status; 
    typedef struct{     
        ElemType *elem;     
        int length;     
        int Listsize;
    }Sqlist;

二、构建初始化函数

  1. 分配空间(void×)malloc(LIST_INIT_SISE * sizeof(ElemType))
  2. 对于内存是否分配成功的容错性检查(特殊返回值)
  3. 对于线性表空表的长度进行初始化为0
  4. 定义内存大小(方便以后比较是否需要扩容)
    Status InitList(Sqlist &L)
    {
        L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
        if(!L.elem)
        {
            printf("硬盘存储空间有限,无法开辟空间\n");
            return ERROR;
        }
        L.length = 0;
        L.Listsize = LIST_INIT_SIZE;//对于内存大小不纠结于字节数,而是能存储的元素个数
        return OK;
    }

三、对线性表进行初值填充

1.判断当前的存储空间是否大于赋值的空间(内存大小判断检查)
(2. 新开辟空间容错性检查
(2. 循环赋值

  1. 对线性表的长度赋值
    Status ValueList(Sqlist &L)
    {
        int i,j;
        printf("请输入线性表表单个数:");
        scanf("%d",&i);
        if(i > L.Listsize)//输入表单数,大于开辟内存大小时
        {
            while(1)//开辟空间直到大于需要的范围为止
            {
                if(i > L.Listsize)
                {
                    L.elem = (ElemType *)realloc(L.elem,LIST_INCREAMENT*sizeof(ElemType));
                    L.Listsize += LIST_INCREAMENT;
                }
                else break;
            }
        }
        for(j = 0 ;j < i; j++)
                scanf("%d",&L.elem[i]);
        L.length = i;//表单长度进行赋值,保存
        printf("赋值成功!!!\n");
        return OK;
    }

三、重置空表

空表的定义:线性表中元素个数n(n>=0)定义为线性表的长度,n = 0时称为空表。

  1. 空表时指针存在,线性表个数归零。
    Status ClearList(Sqlist &L)
    {
        if(L.elem)
        {
            L.length = 0;
            printf("线性表重置成功!!!\n");
            return OK;
        }
        else
        printf("重置失败,线性表不存在!!!\n");
        return FLASE;
    }

##四、判断空表
1. 空表时指针存在,判断线性表个数是否为零。

    Status ListEmpty(Sqlist L)
    {
        if(L.elem)
        {
            if(L.length == 0){printf("此表为空表!!!\n"); return TRUE;}
            printf("此表不为空表!!!\n");
            return FLASE;
        }
        else
        printf("判断失败,线性表不存在!!!\n");
        return ERROR;
    }

五、线性表长度

  1. 直接返回值L.length
    Status ListLength(Sqlist L)
    {
        printf("%d",L.length);
        return OK;
    }

六、获取线性表元素

  1. 确定传输参数类型
  2. 判断获取的索引号是否出边界
    Status GetElem(Sqlist L ,int index )
    {
        int e;
        if(index < 1 || index > L.length)
        {
            printf("获取值失败!!!索引超出边界。\n");
            return ERROR;
        }
        e = L.elem[index];
        return e;
    }

七、查找线性表元素

  1. 遍历元素,找到输出返回
  2. 找不到,返回ERROR。
    Status Search(Sqlist L,ElemType e)
    {
        int j = 0;
        for(;j < L.length; j++)
        {
            if(L.elem[j] == e)
            {
                printf("找到索引元素!!!其编号是%d号\n",j+1);
                return j+1;
            }
            else
            printf("未找到元素!!!\n");
            return FLASE;
        }
    return OK;
    }

八、删除线性表元素

  1. 判断删除索引是否大于线性表最大元素索引
  2. 找到指定位置,向前一位赋值。
    Status DeleteList(Sqlist &L,int index)
    {
        if(index < 1 || index > L.length)
            {
                printf("删除失败!!!索引超出边界。\n");
                return ERROR;
            }
        else
            {
                int j = index- 1;
                for(; j >= L.length-1 ; j++)
                    L.elem[j+1] = L.elem[j];
                L.length--;
                return OK;
            }
    }

九、插入线性表

  1. 插入值的范围[ 1 ~ L.length+1 ] (在每一位的前面插入元素)
  2. 判断是否出了索引边界
     Status DeleteList(Sqlist &L,int index)
        {
            if(index < 1 || index > L.length)
                {
                    printf("删除失败!!!索引超出边界。\n");
                    return ERROR;
                }
            else
                {
                    int j = index- 1;
                    for(; j >= L.length-1 ; j++)
                        L.elem[j+1] = L.elem[j];
                    L.length--;
                    return OK;
                }
        }

十、主菜单

    int main()
    {
    
        Sqlist L;
        int e = 0,index;
        while(1)
        {
            printf("1.初始化线性表,开辟空间\n");
            printf("2.对线性表进行赋值\n");
            printf("3.对线性表进行重置\n");
            printf("4.判断线性表是否为空表\n");
            printf("5.获取线性表长度\n");
            printf("6.获取线性表对应元素\n");
            printf("7.查找线性表对应元素\n");
            printf("8.删除线性表对应元素\n");
            printf("9.插入线性表\n");
            printf("10. 打印\n");
            printf("11. 退出\n");
            int x;
            scanf("%d",&x);
        switch(x)
            {
            case 1: InitList(L);  break;
            case 2: ValueList(L); break;
            case 3: ClearList(L); break;
            case 4: ListEmpty(L); break;
            case 5: ListLength(L); break;
            case 6:
                {
                    printf("请输入想要查找元素的索引号:\n");
                    scanf("%d",&index);
                    GetElem(L,index);
                }break;
            case 7:
                {
                    printf("请输入想要查找的元素:\n");
                    scanf("%d",&e);
                    Search(L,e);
                }break;
            case 8:
                {
                    printf(" 请输入删除元素的索引号:\n");
                    scanf("%d",&index);
                    DeleteList(L,index);
                }break;
            case 9:
                {
                    printf("请输入插入元素的位置索引号:\n");
                    scanf("%d",&index);
                    printf("请输入想要插入的元素:\n");
                    scanf("%d",&e);
                    InsertList(L,index,e);
                }break;
            case 10: PrintList(L);
            case 11: exit(0);
            }
        }
    return 0;
    }

你可能感兴趣的:(数据结构(顺序线性表___C语言代码实现))