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

</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 1000

typedef 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标签,调试程序时请删除;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值