顺序表增删改查两种方法---C实现

来源:互联网 发布:java 设置useragent 编辑:程序博客网 时间:2024/05/21 06:40

一、无返回值的增删改查(且成员elem以指针形式)

#include <stdio.h>#include <malloc.h>#define list_init_size 100#define add_list 10#define ERROR 0#define OK 1typedef int Elemtype;typedef struct{    Elemtype *elem;    int length;    int listsize;}sqlist;void Initlist(sqlist *L)    //初始化{    L->elem=(Elemtype *)malloc(list_init_size*sizeof(Elemtype));    if(!L->elem)    printf("error");    L->length=0;    L->listsize=list_init_size;}void listinsert(sqlist *L,int i,Elemtype e)        //插入{    Elemtype *p,*q,*newbase;    if(i<1||i>L->length+1)       printf("error");    if(L->length>=L->listsize)    {        newbase=(Elemtype *)realloc(L->elem,(L->listsize+add_list)*sizeof(Elemtype));        L->elem=newbase;        L->listsize+=add_list;    }    q=&(L->elem[i-1]);    for(p=&(L->elem[L->length-1]);p>=q;--p)    {        *(p+1)=*p;    }    *q=e;    L->length++;} void deletelist(sqlist *L,int i)   //删除 {    int j;    if(i<1||i>L->length)    printf("error");    else    {        for(j=i;j<=L->length-1;j++)        {            L->elem[j-1]=L->elem[j];        }        L->length--;    } } int searchlist(sqlist L,int e)          //查找 {    int i;    for(i=0;i<L.length;i++)       {           if(L.elem[i]==e)            return i+1;       }       return 0; }void dellist(sqlist *L)              //删除相邻相同数据 {    int i=0,j;    while(i<L->length-1)    {        if(L->elem[i]==L->elem[i+1])        {            for(j=i+1;j<L->length;j++)            {                L->elem[j-1]=L->elem[j];            }            L->length--;        }        else        i++;    } } void changelist(sqlist *L,int i,int e)//修改 {    if(i<1||i>L->length)    {        printf("error");    }    L->elem[i]=e; }int main(){    sqlist L;    int i=3;    int e=8;    int j;    int search;    Initlist(&L);       for(j=0;j<5;j++)       {           scanf("%d",&L.elem[j]);           L.length++;       }       listinsert(&L,i,e);       for(j=0;j<L.length;j++)       {           printf("%d ",L.elem[j]);       }        printf("\n");        deletelist(&L,i);          for(j=0;j<L.length;j++)       {           printf("%d ",L.elem[j]);       }       printf("\n");        dellist(&L);        for(j=0;j<L.length;j++)       {           printf("%d ",L.elem[j]);       }       printf("\n");       changelist(&L,2,7);        for(j=0;j<L.length;j++)       {           printf("%d ",L.elem[j]);       }       printf("\n");       printf("%d",searchlist(L,5));}

二、有返回值的增删改查(且成员elem以数组出现)

#include <stdio.h>#define list_init_size 100#define add_list 10typedef int Elemtype;typedef struct{    Elemtype elem[list_init_size];    Elemtype length;}sqlist;void initlist(sqlist L)//初始化{    L.length=0;}sqlist insertlist(sqlist L,Elemtype i,Elemtype e)//插入{    int k;    if(i<1||i>L.length+1)        printf("error1");    for(k=L.length-1;k>=i-1;k--)    {        L.elem[k+1]=L.elem[k];    }    L.elem[i-1]=e;    L.length++;    return L;}sqlist deletelist(sqlist L,Elemtype i)//删除{    if(i<1||i>L.length)        printf("error");    for(;i<L.length-1;i++)    {        L.elem[i-1]=L.elem[i];    }    L.length--;    return L;}sqlist changelist(sqlist L,Elemtype i,Elemtype e)//修改{    if(i<1||i>L.length)        printf("error");    L.elem[i-1]=e;    return L;}int searchlist(sqlist L,Elemtype e)//查找{   int i;   for(i=0;i<L.length&&L.elem[i]!=e;i++);   if(i<L.length)    return i+1;   else    return 0;}sqlist dellist(sqlist L)//删除相邻相同数据{    int i=0,j;    while(i<L.length-2)    {        if(L.elem[i]==L.elem[i+1])        {            for(j=i;j<L.length;j++)            {                L.elem[j]=L.elem[j+1];            }            --L.length;        }        else            ++i;    }    return L;}sqlist dellist_two(sqlist L)//删除顺序表中相同的数(可相邻也可不相邻,100以内){    int i=0,j=0;    int c;     for(L.length=1,i=0;i<5;i++)    {        scanf("%d",&c);        //L.length++;        L.elem[c]=1;    }    return L;}void list_display(sqlist L)//输出{    int j;    for(j=0;j<L.length-1;j++)    {        printf("%d  ",L.elem[j]);    }    printf("\n");}int main(){sqlist L;int i;int search;initlist(L);printf("input 5 numbers:\n");for(L.length=1,i=0;i<5;i++){    scanf("%d",&L.elem[i]);    L.length++;}printf("在第二位置插入7\n");L=insertlist(L,2,7);list_display(L);printf("删除第二个位置的数\n");L=deletelist(L,2);list_display(L);printf("将第二个数改为8\n");L=changelist(L,2,8);list_display(L);printf("寻找1\n");search=searchlist(L,1);printf("%d\n",search);printf("删除相邻相同的数\n");L=dellist(L);list_display(L);printf("输入5个数\n");for(i=0;i<=99;i++){   L.elem[i]=0;}L=dellist_two(L);printf("删除顺序表中相同的数,100以内");for(i=1;i<=99;i++){    if(L.elem[i]==1)        printf("%d ",i);}return 0;}