数据结构C语言实现线性顺序表基本操作(创建,插入,删除,合并)

#include<stdio.h>
#include<stdlib.h>

#define  TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 10

typedef int ElemType;
typedef int Status;

typedef struct{
 ElemType *elem;
 int length;
 int listsize;
}SqList;


Status InitList_Sq(SqList *L) //创建线性表
{
 L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
 if(!L->elem) exit(OVERFLOW);
 L->length=0;
 L->listsize=LIST_INIT_SIZE;
 return OK;
}


Status PrintList(SqList L) //输出线性表
{
 ElemType *p,*q;
 p=L.elem;
 q=L.elem+L.length-1;
 if(L.length==0)
 {
  printf("线性表为空");
  return ERROR;
 }
 for(;p<=q;p++)
 {
   printf("%-6d",*p);
    }
    printf("\n");
    return OK;
}


Status ListInsert(SqList *L,int i,ElemType e) //数据插入
{
 ElemType *newbase,*q,*p;
 int j;
 if(i<0||i>L->length+1)
 {
  printf("i值不合法\n");
  return ERROR;
    }
 if(L->length>=L->listsize)
 {
  newbase=(ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
  if(!newbase) exit(OVERFLOW);
  L->elem=newbase;
  L->listsize=L->listsize+LISTINCREMENT;
  printf("expand successfully\n");  
    }
 q=&L->elem[i-1];
 for(p=&L->elem[L->length-1];p>=q;p--)
 {
  *(p+1)=*p;
 }
 *q=e;
 L->length++;
 return OK;
}


Status ListDelet(SqList *L,int i,ElemType *e) //数据删除
{
 ElemType *p,*q;
 int j;
 if(i<1||i>L->length)
 return ERROR;
 p=&L->elem[i-1];
 q=&L->elem[L->length-1];
 *e=*p;
 for(;p<q;p++)
 *(p)=*(p+1);
 L->length--;
 return OK;
}

Status GetElem(SqList L,int i,ElemType*e) //获取第i位的元素
{
 *e=L.elem[i-1];
 return OK;
}
Status ListSort(SqList *L)//排序
{
 int i,j,temp;
 for(i=0;i<L->length-1;i++)
    for(j=0;j<L->length-1-i;j++)
    {
     if(L->elem[j]>L->elem[j+1])
     {
      temp=L->elem[j];
      L->elem[j]=L->elem[j+1];
      L->elem[j+1]=temp;
     }
    }
 
}


Status MergeList(SqList La,SqList Lb,SqList *Lc) //线性表合并
{
 ElemType *pa,*pb,*pc,*qa,*qb;
 pa=&La.elem[0];
 pb=&Lb.elem[0];
 Lc->listsize=Lc->length=La.length+Lb.length;
 Lc->elem=(ElemType *)malloc(Lc->listsize*sizeof(ElemType));
 pc=Lc->elem;
 if(!Lc->elem)
 exit(OVERFLOW);
 qa=&La.elem[La.length-1];
 qb=&Lb.elem[Lb.length-1];
 while(pa<=qa&&pb<=qb)
 {
  if(*pa >= *pb)
  *pc++ = *pb++;
  else
  *pc++ = *pa++;
 }
 while(pa<=qa)
 *pc++ = *pa++;
 while(pb<=qb)
 *pc++ = *pb++;
    return OK;
}
 
int main()
{
 SqList L,L1,L2;
 int i,n,j;
 ElemType e;
 InitList_Sq(&L);
 InitList_Sq(&L1);
 printf("创建线性表L\n");
 printf("请输入10个数据\n");
 for(i=1;i<=10;i++)
 {
    scanf("%d",&n);
    if(ListInsert(&L,i,n)!=1)
    {
      printf("插入失败");
      return ERROR;
    }
    }
    printf("线性表L中的数据\n");
 PrintList(L);
 printf("请输入需要插入的位置\n");
 scanf("%d",&j);
 printf("请输入需要插入的数据\n");
 scanf("%d",&e);
 ListInsert(&L,j,e);
 printf("当前线性表中的数据\n");
 PrintList(L);
 printf("请输入需要删除数据的位置\n");
 scanf("%d",&j);
 ListDelet(&L,j,&e);
 printf("当前线性表中的数据\n");
 PrintList(L);
    printf("被删除的数据%d\n",e);
    printf("请输入需要返回数据的位置\n");
 scanf("%d",&j);
 GetElem(L,j,&e);
 printf("%d\n",e);
 printf("创建线性表L1\n");
 printf("请输入10个数据\n");
 for(i=1;i<=10;i++)
 {
    scanf("%d",&n);
    if(ListInsert(&L1,i,n)!=1)
    {
      printf("插入失败");
      return ERROR;
    }
    }
    printf("线性表L1中的数据\n");
 PrintList(L1);
 ListSort(&L);
 ListSort(&L1);
    printf("合并线性表L和L1为线性表L2\n");
    MergeList(L,L1,&L2);
    PrintList(L2);
    printf("\n\t\t\t\t杨佳宁制作");
 return 0;
}
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值