• 数据结构——线性表的顺序表示


    最近做了个实验,写个线性表,感觉挺好写,但还是发现了几个值得注意的地方,代码如下:

    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #define TRUE 1
    #define FALSE 0
    #define OVERFLOW -2
    #define OK 1
    #define ERROR 0
    #define LIST_INIT_SIZE 10
    #define LISTINCREMENT 4
    typedef int Elemtype;
    typedef int Status;
    typedef struct
    {
    Elemtype *elem;
    int length;
    int listsize;
    }Sqlist; //线性表结构
    Status Init_list(Sqlist *L) //构造线性表
    {
    L->elem=(Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
    if(!L->elem)return(OVERFLOW);
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
    return OK;
    }

    Status Insert_list(Sqlist *L,int i,Elemtype e)//插入元素
    {
    Elemtype *p,*q,*newbase;
    if(i<1||i>L->length+1)return ERROR;
    if(L->length>=L->listsize)
    {
    newbase=(Elemtype *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(Elemtype));
    if(!newbase)return OVERFLOW;
    L->elem=newbase;
    L->listsize+=LISTINCREMENT;
    }
    q=&(L->elem[i-1]);
    for(p=&(L->elem[L->length-1]);p>=&(L->elem[i-1]);p--)
    *(p+1)=*p;
    *q=e;
    ++L->length;
    return OK;

    }

    Status Del_list(Sqlist *L,int i,Elemtype *e)//删除元素
    {
    Elemtype *p;
    if(i<1||i>L->length)return ERROR;
    p=&(L->elem[i-1]);
    *e=*p;
    for(p++;p<=&(L->elem[L->length-1]);p++)
    *(p-1)=*p;
    --L->length;
    //此处不能free(p-1); 线性表不能随便free 不如链表
    return OK;
    }
    void DisplayElem(Sqlist *L,int i)//显示一个元素
    {
    printf("%-4d\n",L->elem[i-1]);
    }
    void Display_list(Sqlist *L)//显示所有元素
    {
    int i;
    for(i=0;i<L->length;i++)
    printf("%-4d",L->elem[i]);
    }
    void print()
    {
    printf("1)插入\n2)删除\n3)查找一个元素\n4)查看所有元素\n0)退出\n");
    }

    int main()
    {
    Sqlist L;
    Elemtype e;
    int i,p=1;
    char select;
    if(Init_list(&L)==OK)
    {
    printf("请分别输入10个元素的数值:\n");
    for(i=0;i<10;i++)
    scanf("%d",&L.elem[i]);
    L.length=10;
    while(p==1)
    {
    p=0;
    print();
    getchar();//接收回车符
    select=getchar();
    switch(select)
    {
    case '1':printf("请分别输入插入位置和插入的元素:");scanf("%d%d",&i,&e);Insert_list(&L,i,e);p=1;break;
    case '2':printf("请输入删除的位置:");scanf("%d",&i);Del_list(&L,i,&e);printf("删除的元素为%d\n",e);p=1;break;
    case '3':printf("请输入显示的元素的位置:");scanf("%d",&i);DisplayElem(&L,i);p=1;break;
    case '4':Display_list(&L);p=1;break;
    case '0':p=0;break;
    default:
    {
    printf("输入错误!请重新输入:0-4之间的数字:\n");
    getchar();
    p=1;
    }
    }//switch
    if(p==1)
    {
    printf("\n请输入任意键进入主程序……\n");
    getch();
    system("cls");
    }

    }//while

    }//if

    return 0;
    }

    值得注意的地方:

    1)数据结构书中所描述的算法中带‘&’的表示引用该值后还要返回该值。在写程序时函数中应该用‘*’,在主函数中实参应该用‘&’,不能混淆了;

    2)结构体中Elemtype *elem 表示线性表的基地址,如果分配了一段空间,则能用数组形式比如L.elem[i],实际上L.elem[i] 即是L.*(elem+i);

    即Elemtype *elem即是Elemtype elem[0];

    3)比如删除元素后,不要释放空间,否则出错,链表则可以且应该;

    4)不能把switch中的内容另外写到一个函数中,因为这样必须得定义一个线性表变量,则不是原来的线性表,就会出错;解决方法可以是用全局变量,不过不好;

    5)函数很方便,要常用!

  • 相关阅读:
    30-语言入门-30-分数加减法
    29-语言入门-29-两点距离
    bootstrapcss3触屏滑块轮播图
    input输入样式,动画
    HTML5夜空烟花绽放动画效果
    精美留言、评论框,带微博表情
    Sublime Text 3汉化中文版
    直播英国脱欧各国反应?谁将是最大赢家?
    品牌关键字的重要性?是什么呢
    网站收录之网络推广
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2424387.html
Copyright © 2020-2023  润新知