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;        //初始的存储容量
c语言listinsert函数}
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;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。