线性表基本操作

第一篇博客

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

#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 100
typedef 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值