美文网首页
数据结构(顺序线性表___C语言代码实现)

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

作者: domsylavy | 来源:发表于2018-09-24 21:19 被阅读0次

    一.准备工作做好:

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

    1. 状态量
    2. 内存大小量、内存增加量
    3. 重定义整形(int)类型变量
        #include<stdio.h>
        #include<stdlib.h>
        #include <malloc.h>
        
        #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语言代码实现)

          本文链接:https://www.haomeiwen.com/subject/ckmhoftx.html