线性表基本操作

来源:互联网 发布:python unicode转中文 编辑:程序博客网 时间:2024/06/07 16:33

第一篇博客

线性表基本操作,暑假把大一的代码练习一遍。多多指教,谢谢

#include<stdio.h>#include<stdlib.h>#define TRUE  1#define FALSE 0#define OK   1#define ERROR 0#define OVERFLOW -1 #define LIST_INIT_SIZE 100typedef struct{ int *base; int length; int listsize;}SqList;int InitSqlist(SqList &l)//初始化{   l.base = (int *)malloc(LIST_INIT_SIZE*sizeof(int));    if(!l.base)exit(OVERFLOW);    l.listsize = LIST_INIT_SIZE;    l.length = 0;    return OK; }int BulidSqlist (SqList &l){   int i,n;    printf("请输入元素的个数\n");    scanf("%d",&n);    if(n>LIST_INIT_SIZE)    {    l.base = (int *)realloc(l.base,(n*10)*sizeof(int));     if(!l.base)exit(OVERFLOW);    l.listsize = n;    }    printf("请输入%d个元素的值\n",n);    for(i=0;i<n;i++)    scanf("%d",l.base+i);    l.length = n;    return OK;} void PrintSqlist(SqList &l)//输出元素以及表长{    int i;    for(i=0;i<l.length;i++)    printf("第%d个元素为%d\n",i+1,*(l.base+i));    printf("表长为:%d\n",l.length);}   void Tips()//提示函数{     printf("\n请选择你的想要的操作:\n");     printf("<1> 输出顺序表及顺序表的长度\n");     printf("<2> 删除值为x的结点\n");     printf("<3> 删除给定位置i的结点\n");     printf("<4> 将顺序表逆置\n");     printf("<5> 将顺序表按升序排序\n");     printf("<6> 将x插入到顺序表的适当位置上\n");     printf("<7> 将两个有序表合并\n");     printf("<0> 退出\n\n");}int  DeleteSqlist(SqList &l,int x)//删除值为X的元素{    int i;    for(i=0;i<l.length;i++)    if(*(l.base+i) == x)        break;    if(i == l.length)    return ERROR;    for(i++;i<l.length;i++)    *(l.base+i-1) = *(l.base+i);    l.length--;     printf("删除后的Sqlist:\n");        for(i=0;i<l.length;i++)         printf("%d\n",*(l.base+i));     return OK;    }int DeleteSqlistIndex(SqList &l,int x)//删除指定位置的元素 {   int i;    if(x < 0 || x >= l.length)    return ERROR;    for(i=x+1;i<l.length;i++)    *(l.base+i-1) = *(l.base+i);    l.length--;     printf("删除后的Sqlist:\n");        for(i=0;i<l.length;i++)         printf("%d\n",*(l.base+i));     return OK;}void Inverse(SqList &l)//逆置函数 {   int i,t;    for(i=0;i<l.length/2;i++)    {        t=*(l.base+i);        *(l.base+i) = *(l.base+l.length-i-1);        *(l.base+l.length-i-1) = t;    }     printf("逆置后的Sqlist:\n");        for(i=0;i<l.length;i++)         printf("%d\n",*(l.base+i)); }void SortSqlist(SqList &l)//冒泡 {   int i,j,t;    printf("排序前的Sqlist:\n");    for(i=0;i<l.length;i++)     printf("%d\n",*(l.base+i));         for(i=1;i<l.length;i++)        for(j=0;j<l.length-i;j++)        {            if(*(l.base+j)>*(l.base+j+1))          {                t = *(l.base+j);                *(l.base+j) = *(l.base+j+1);                *(l.base+j+1) = t;           }         }         printf("排序后的Sqlist:\n");        for(i=0;i<l.length;i++)         printf("%d\n",*(l.base+i)); }int InserSqList(SqList &l,int x)//插入X(保持有序) {   int i,tag;    printf("插入前的Sqlist:\n");    for(i=0;i<l.length;i++)     printf("%d\n",*(l.base+i));    if(l.length >= l.listsize)    {    l.base = (int *)realloc(l.base,(10)*sizeof(int));        if(!l.base)        exit(OVERFLOW);        l.listsize += 10;    }     for(i=0;i<l.length;i++)    if(x < *(l.base+i)) break;    tag = i;    for(i=l.length;i>tag;i--)    *(l.base+i) = *(l.base+i-1);    *(l.base+tag) = x;    l.length++;     printf("插入后的Sqlist:\n");    for(i=0;i<l.length;i++)     printf("%d\n",*(l.base+i));     return OK;}int MergerSqlist(SqList &l,SqList &lb)//合并2个线性表 {    int i,j,k;    SqList lc;    InitSqlist(lc);    if(lc.listsize<l.length + lb.length)    {lc.base = (int *)realloc(lc.base,(l.length+lb.length+10)*sizeof(int));    if(!lc.base)    return ERROR;    lc.listsize = lc.listsize+l.length+lb.length+10;    }    i = j = k = 0;    while(i<l.length && j<lb.length)    {        if(*(l.base+i) < *(lb.base+j))        {            *(lc.base+k) = *(l.base+i);            k++,i++;        }        else        {            *(lc.base+k) = *(lb.base+j);            k++;j++;        }    }       while(i<l.length)    {        *(lc.base+k) = *(l.base+i);        i++;k++;    }    while(j<lb.length)    {        *(lc.base+k) = *(lb.base+j);        j++;k++;    }    lc.length = l.length + lb.length;    printf("合并后的Sqlist:\n");    for(i=0;i<lc.length;i++)     printf("%d\n",*(lc.base+i));    return OK;  }     int main(){       int operate,x,tag;    SqList l,lb;    InitSqlist(l);    BulidSqlist(l);     Tips();    scanf("%d",&operate);    while(operate)    {        switch(operate)        {            case 1 : PrintSqlist(l);break;            case 2 : printf("请输入想要删除的元素\n");                     scanf("%d",&x);                     tag = DeleteSqlist(l,x);                     if(tag)                                printf("删除值为%d的元素成功\n",x);                     else                            printf("删除值为%d的元素失败\n",x);                     break;             case 3 : printf("请输入要删除的位置\n");                     scanf("%d",&x);                     tag = DeleteSqlistIndex(l,x-1);                      if(tag)printf("删除位置为%d的元素成功\n",x);                     else printf("删除位置为%d的元素失败\n",x);                     break;             case 4 : Inverse(l);                     break;            case 5 : SortSqlist(l);                     break;            case 6 : printf("请输入要插入的数据:\n");                     scanf("%d",&x);                     tag = InserSqList(l,x);                     if(tag)printf("插入值为%d的元素成功\n",x);                     else printf("插入值为%d的元素失败\n",x);                     break;             case 7 : printf("请输入Lb的内容\n");                     InitSqlist(lb);                     BulidSqlist(lb);                     tag = MergerSqlist(l,lb);                     if(tag)printf("合并成功\n",x);                     else printf("合并失败\n",x);                     break;         }        Tips();        scanf("%d",&operate);    }        return 0;        }
0 0