C语言实现线性表的顺序表及操作。
#include <stdlib.h> #include <stdio.h> #include <stdbool.h> # define List_Init_Size 100 # define ListIncrement 10 typedef int ElemType; //定义数据元素的类型,方便更换元素的类型,一改全改 typedef struct { ElemType *elem; //存储空间基址 int length; //当前长度(数据元素个数) int ListSize;//当前分配的存储容量 } Sqlist; //定义顺序表的类型 //顺序表初始化函数 bool InitList (Sqlist *L) { L->elem=(ElemType *)malloc(List_Init_Size*sizeof(ElemType));//为顺序表分配一个大小为List_Init_Size的数组空间 if (!L->elem) exit(0) ; L->length=0; L->ListSize=List_Init_Size; return true; } //向顺序表插入第i个元素 void InsertList(Sqlist *L,int i,ElemType x) { int j; for(j=L->length-1;j>= i-1;--j) L->elem[j+1]=L->elem[j];//将第i及以后的元素都向后移一位 L->elem[i-1]=x; ++L->length;//等同于l->length=l->length+1 } //删除顺序表中第i个数据元素 void deleteList(Sqlist *L,int i) { int j; if(i<1 || i>L->length) { printf("Position error"); return;//强制退出函数 } for(j=i;j<L->length;j++) L->elem[j-1]=L->elem[j]; L->length--; } //查找元素x,找到返回序号,找不到返回0 int Locate(Sqlist L, ElemType x) { int i=1; while(i<=L.length && L.elem[i-1]!=x) ++i; if(i<=L.length) return i; else return 0; } //获取第i个元素 void GetElem(Sqlist L,int i, ElemType *e) { *e=L.elem[i-1]; } //返回顺序表的长度 int ListLength(Sqlist L) { return L.length; } //输出顺序表 void Output(Sqlist L) { printf("number of elements:%d\n",L.length); for (int i=1;i<=L.length;i++) { printf("%d element:%d\n",i,L.elem[i-1]); } } //输入n个数据元素 void Input(Sqlist *L) { int n,x; scanf ("%d",&n); for (int i=1;i<=n;i++) { scanf ("%d",&x); L->elem[i-1]=x; L->length++; } } //两个线性表并运算 (向第一个表中添加第二个表中有而第一个没有的元素) void unio(Sqlist *La,Sqlist Lb) { ElemType e; int La_len=La->length; int Lb_len=Lb.length; for(int i=1;i<=Lb_len;++i) { GetElem(Lb,i,&e);//获取第i个元素 if(!Locate(*La,e))//Locate(*La,e)查找元素x,找到返回序号,找不到返回0 InsertList(La,++La_len,e);//向顺序表插入第i个元素 } Output(*La);//输出顺序表 } //将两个顺序表合并到第三个顺序表中 void mergelist(Sqlist La,Sqlist Lb,Sqlist *Lc) { int i=1,j=1,k=0; ElemType ai,bj; int La_len=ListLength(La);//ListLength()返回顺序表的长度 int Lb_len=ListLength(Lb); while((i<=La_len)&&(j<=Lb_len)) { GetElem(La,i,&ai);//获取第i个元素 GetElem(Lb,j,&bj); if(ai<=bj) { InsertList(Lc,++k,ai);//InsertList向顺序表插入第i个元素 ++i; } else { InsertList(Lc,++k,bj); ++j; } } while(i<=La_len) { GetElem(La,i++,&ai); InsertList(Lc,++k,ai); } while(j<=Lb_len) { GetElem(Lb,j++,&bj); InsertList(Lc,++k,bj); } Output(*Lc); } int main(int argc, const char * argv[]) //主函数 { Sqlist L,La,Lb,Lc; int conti=1,choice=0,loc=0; ElemType x; while (conti) { printf("1.Initial 2.Insert 3.Delete 4.Locate 5.并集 6.Merge 7.Output 8.Exit"); scanf ("%d",&choice); switch (choice){ int i; case 1: InitList(&L); break; case 2: printf("请输入要插入的位置"); scanf ("%d",&i); printf("请输入要插入的内容"); scanf ("%d",&x); InsertList(&L,i,x); break; case 3: printf("请输入要删除的位置"); scanf ("%d",&i); deleteList(&L,i); break; case 4: printf("请输入要定位的内容:"); scanf ("%d",&x); loc = Locate(L,x); if (!loc) printf("该元素不存在\n"); else printf("该元素的序号是:%d \n",loc); break; case 5: InitList(&La); InitList(&Lb); printf("请输入La中的元素个数:"); Input(&La); printf("请输入Lb中的元素个数:"); Input(&Lb); unio(&La,Lb); break; case 6: InitList(&La); InitList(&Lb); InitList(&Lc); printf("请输入La中的元素个数:"); Input(&La); printf("请输入Lb中的元素个数:"); Input(&Lb); mergelist(La,Lb,&Lc); break; case 7: Output(L); break; case 8: conti=0; break; } } return 0; }