C语言数据结构动态线性表的操作集

c语言数据结构动态线性表的算法实现,基本上都是书上算法,理解起来很容易


#include<stdio.h>

#include<stdlib.h>
#include<malloc.h>
#define M 100            //线性表存储空间的初始分量
#define m 10             //线性存储空间的分配增量
                    
typedef int ElemType;
typedef struct{
ElemType *elem;       //存储空间的基地址
    int length;       //当前长度
int listsize;         //当前分配的存储容量
}Sqlist;




void Initlist(Sqlist &L)      //构造一个空的线性表
{
   L.elem=(ElemType*)malloc(M*sizeof(ElemType));
   if(!L.elem)exit(-1); //存储分配失败
   L.length=0;         //空表长度为0
   L.listsize=M;        //初始的存储容量
}






void scanflist(Sqlist &L,int b)//输入函数
{   
int i,x;
for(i=0;i!=b;i++)  //如果输入数据没有b个元素则继续循环
{
scanf("%d",&x);
L.elem[i]=x;      //放入线性表中
++L.length;       //长度加一
}
}










void Insertlist(Sqlist &L,int i,int e)   //线性表的插入函数
{    
    ElemType *base,*insert,*p;
if(i<1||i>L.length+1)exit(0);   //插入的位置不合法
if(L.length>=L.listsize)         //当前的空间已满
{
base=((ElemType*)realloc(L.elem,(L.listsize+m)*sizeof(ElemType)));
L.elem=base;
L.listsize+=m;
}                  
insert=&(L.elem[i-1]);     //insert为插入的位置
for(p=&(L.elem[L.length-1]);p>=insert;p--) //插入位置及之后的元素后移
*(p+1)=*p;
*insert=e;      //插入e
L.length++;      //表长加一
}








void Deletelist(Sqlist &L,int i)       //线性表的删除函数
{
ElemType *q,e,*p;
if(i<1||1>L.length)exit(0);           //删除的位置不合法
p=&(L.elem[i-1]);                  //p为被删除元素的位置
e=*p;                             //被删除元素的值赋给e
q=L.elem+L.length-1;        //表尾元素的位置
for(++p;p<=q;++p)             //被删除元素之后的元素左移
*(p-1)=*p;                     //表长减一
--L.length;
}








void print(Sqlist &L)              //输出函数
{
int i;
for(i=0;i<L.length;i++)
printf("%4d",L.elem[i]);
   printf("\n");
}




void getlist(Sqlist &L,int i,ElemType e)    //查找线性表  
{
   if(L.length==0||i<1||i>L.length)   //查找的位置不存在
  printf("input error\n");
   else 
  e=L.elem[i-1];        //将第i个元素位置的值传递给e
  printf("%d\n",e);
}




void searchlist(Sqlist L,ElemType k)      //查找的元素在线性表中是否存在与之相等的元素
{
    int i=0;
    while (i<L.length && L.elem[i]!=k)   //如果还没找到且小于表长,继续找
        i++;
    if (i>=L.length)
        printf("木有找到:\n");
    else
        printf("这个元素在第%d个位置:\n",i+1);
}






void linklist(Sqlist L,Sqlist B,Sqlist &C)   //将两个有序的线性表合并成为一个有序的线性表
{
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
int i;
pa=L.elem;
pb=B.elem;
C.listsize=C.length=L.length+B.length;           //新的线性表的长度
pc=C.elem=(ElemType*)malloc(C.listsize*sizeof(ElemType));  //分配空间
pc=C.elem;                     //pc为C的基地址
if(!C.elem)exit(0);
pa_last=L.elem+L.length-1;     //线性表的最后一个元素的地址
pb_last=B.elem+B.length-1;       
while(pa<=pa_last&&pb<=pb_last)    //合并
{
if(*pa<=*pb)*pc++=*pb++;
else *pc++=*pb++;
}
while(pa<=pa_last) *pc++=*pa++;    //插入L中剩余的元素
while(pb<=pb_last )*pc++=*pb++;    //插入B中剩余的元素


for(i=0;i<C.length;i++)
printf("%4d",C.elem[i]);
   printf("\n");
}




    










int main()
{
Sqlist l,B,C;
int i,b,j,y;
ElemType e;
  int choice;
printf("输入1是创建列表和输入列表并打印\n输入2是插入数据并打印列表\n输入3是删除数据并打印列表\n输入4是查找第几个元素\n输入5是查找线性表是否有这个元素\n输入6是合并两个线性表:\n输入7是再创建线性表,并输入数据************正在等待用户输入........\n");
while(scanf("%d",&choice)!=EOF)
{
if(choice==1)
{
Initlist(l);
printf("线性表创建完成。。。\n");
printf("请输入个数:\n");
scanf("%d",&b);
printf("请依次输入数据;\n");
scanflist(l,b);
   printf("输出这个线性表:\n");
print(l);
}




if(choice==2)
{
printf("请输入在什么位置插入什么数;\n");
scanf("%d %d",&i,&j);
Insertlist(l,i,j);
printf("输出这个线性表:\n");
print(l);
}
if(choice==3)
{
printf("请输入删除第几个数;\n");
scanf("%d",&j);
   Deletelist(l,j);
         printf("输出这个线性表:\n");
   print(l);
}
if(choice==4)
{
printf("请输入查找的第几个数:\n");
scanf("%d",&i);
getlist(l,i,e);


}
if(choice==5)
{
printf("请输入需要查找的元素\n");
scanf("%d",&y);
searchlist(l,y);
}
if(choice==6)
{
           linklist(l,B,C);
}




if(choice==7)
{
Initlist(B);
printf("线性表创建完成。。。\n");
printf("请输入个数:\n");
scanf("%d",&b);
printf("请依次输入数据;\n");
scanflist(B,b);
   printf("输出这个线性表:\n");
print(B);
}


printf("*************正在等待用户输入......\n");
}
return 0;
}








  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值