数据结构之顺序表常用操作整理

来源:互联网 发布:win10磁盘优化有几遍 编辑:程序博客网 时间:2024/06/05 02:49
</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">#include <stdio.h>#include <stdlib.h>#define List_init_size 1000#define Listincrease 1000typedef int Element;typedef struct{    Element *elem;    int length;    int listsize;}Sqlist;int Initlist(Sqlist *L)//万年不变的初始化{    L->elem=(Element *)malloc(List_init_size*sizeof(Element));    if(!L->elem)exit(-1);/*此处也可以是return -1;具体return与exit区别    此处附上几条博客链接:http://blog.csdn.net/xuan_h/article/details/23935471    http://blog.csdn.net/jody1989/article/details/6821477    http://blog.csdn.net/u010046690/article/details/47105665    不喜勿喷    */    L->length=0;    L->listsize=List_init_size;    return 1;}int Createlist(Sqlist *L,int n)//一、为线性表输入元素{    int i;    for(i=0;i<n;i++)    {        scanf("%d",&L->elem[i]);    }    L->length=n;//此处新手易忘    return 1;}int Destroylist(Sqlist *L)//二、摧毁顺序表{    free(L->elem);/*此处亦可以用(*L).elem    具体两者的区别,结构体指针变量可以用->,    而普通结构体变量则用.    */    L->elem=NULL;//摧毁,简单粗暴    L->length=0;    L->listsize=0;    return 1;}int Clearlist(Sqlist *L)//三、只是清空表{    L->length=0;/*    此时虽说表已经清空,但是原来在表中的元素依然存在    也就是说仍然可以访问原来的那些元素,只是此时访问的话是    非法的,清空之后,键入新元素会覆盖以前的那些数据,    所以并不会影响以后数据的输入,也节省了删除这些数据的时间    */    return 1;}int Emptylist(Sqlist *L)//四、判断表是否非空{    if(L->length==0)return 1;    else return 0;}int Lengthlist(Sqlist *L){//五、返回顺序表的长度,个人感觉这个函数并无卵用    return L->length;}int Getelem(Sqlist *L,int i,Element *e){//六、获取顺序表中位序为i的元素    if(i<1||i>L->length)return -1;//判断i位置是否合法    *e=(L->elem[i-1]);//用e返回也可直接return e;    return 1;}/*较为重要的函数,很常用*/int Deletelist(Sqlist *L,int i,Element *e){//七、删除位序为i的元素    //i为要删除元素的位序,注意位序和数组下标的关系    int *p,*q;    if((i<1)||(i>(L->length)))return -1;    p=&(L->elem[i-1]);//要删除的元素    *e=*p;//将其付给e返回    q=L->elem+L->length-1;//指向最后一个元素    for(;p<q;p++)    {        *p=*(p+1);//移位覆盖删除    }    L->length--;//此处易忘    return 1;}/*较为重要的函数,插入函数,常用*/int Insertlist(Sqlist *L,int i,Element e){//八、在位置i之前插入新元素e Element *newbase;//注意其类型    int *p,*q;//注意其类型    if(i<1||i>L->length)return -1;//判断i位置是否合法    if(L->length>=L->listsize)//当内存不足时    {        newbase=(Element *)realloc(L->elem,                                   (L->listsize+Listincrease)*sizeof(Element));        if(!L->elem)return -1;//莫忘        L->elem=newbase;        L->listsize+=Listincrease;//内存增大    }    q=&(L->elem[i-1]);//取要插入数位置的地址    for(p=&(L->elem[L->length-1]);p>=q;p--)    {        *(p+1)=*p;//往后移位空出要插入的位置        //此处注意对比删除函数中,循环条件与移动方式    }    *q=e;//插入    L->length++;//莫忘长度加一    return 1;}int Display(Sqlist *L){//九、顺序表输出函数    int i;    for(i=0;i<L->length;i++)    {        printf(i==L->length-1?"%d\n":"%d ",L->elem[i]);    }    return 1;}int main(){    int n;    Sqlist L;    while(1)    {        Element e;        scanf("%d",&n);        Initlist(&L);        Createlist(&L,n);        printf("输出************\n");        Display(&L);        printf("删除之后************\n\n");        Deletelist(&L,3,&e);        Display(&L);        printf("查入之后************\n\n");        Insertlist(&L,3,e);        Display(&L);        printf("取某一元素输出************\n\n");        Getelem(&L,3,&e);        printf("%d\n",e);        printf("清空表之后************\n\n");        Clearlist(&L);        printf("%d\n",L.length);        printf("摧毁表之后************\n\n");        Destroylist(&L);        Display(&L);//此句无效    }    return 0;}
span()为HTML标签,调试程序时请删除;
1 0
原创粉丝点击