顺序表:顺序表,全名顺序存储结构,是线性表的一种。,线性表用于存储逻辑关系为“一对一”的数据。
本代码涉及顺序表的建立,输出,查找元素,删除,合并两个顺序表(保持有序)
运行展示:
代码:
#define MAXSIZE 100 //MAXSIZE为线性表可能的最大长度 #include<stdio.h> typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; // length为线性表的长度 }SqList; //线性表定义 void InitList(SqList *L) //初始化操作,将线性表L置空 { L->length=-1; } void CreatSqlist(SqList *L,int n)//建立顺序表 { int i; for(i=0;i<n;i++) //根据给的数多少来确定表长,并输入 { printf("请输入第 %d 个数", i); scanf("%d", &L->data[i]); L->length=n-1; } } void Output(SqList *L) //输出顺序表L { int i; for (i=0;i<=L->length;i++) printf("%5d",L->data[i]); //每个数据占5列 printf("\n"); } int IsEmpty(SqList *L) //判断表是否为空,如L是空表,返回1,否则返回0 { return 0; } int GetElem(SqList *L,int i) //取表中第i元素 { int j; if(i>L->length) printf("无该元素"); else j=L->data[i]; return j; } int LocateElem(SqList *L,ElemType x)//定位函数,返回L中第1个与x相等的数据元素的位置(从0算起),否则返回值为0 { int i; for(i=0;L->data[i]!=x&&1<=L->length; i++); {if(i>L->length) return -1; else return i;} } int Insert(SqList *L,ElemType x,int i)//在线性表L中第i个数据元素之前插入一个数据元素x { int k; if(i<0||i>L->length+1||L->length==MAXSIZE-1) //插入位置不能大于表长 return 0; else for(k=L->length;k>=i;k--) //依次把数据后移,再找到对应位置放入数据 { L->data[k+1]=L->data[k];} L->data[i]=x; L->length++; return 1; } int Delete(SqList *L, int i) //删除线性表L中第i个数据元素 { int k; if(i<0||i>L->length) //判删除位置无误 return 0; for(k=i;k<L->length;k++) //循环将后面值往前覆盖 { L->data[k]=L->data[k+1]; L->length--; return 1; } } void Clear(SqList *L) //置空线性表L { } void MergeList(SqList *La,SqList *Lb,SqList *Lc)//合并有序表La和Lb到表Lc中,使得表Lc依然有序 { int i,j,k; //定义三个变量分别来遍历a b 和新表c i=0,j=0,k=0; while(i<=La->length&&j<=Lb->length) //如果a表b表有一个不为空则循环继续 if(La->data[i]<Lb->data[j]) { Lc->data[k]=La->data[i]; k++; i++; } else{ Lc->data[k]=Lb->data[j]; k++; j++; } while(i<=La->length) { Lc->data[k]=La->data[i]; k++; i++; } while(j<=Lb->length){ Lc->data[k]=Lb->data[j]; k++; j++; } Lc->length=k-1; } void Output1 ( ) { int i; for (i=0;i<10;i++) printf(" "); for (i=0; i< 32; i++) printf("*"); printf("\n"); } void main1() { int i; Output1(); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("1.建立一个顺序表 *"); for (i=0; i< 10; i++) printf(" "); printf("\n"); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("2.输出一个顺序表 *"); for (i=0; i< 10; i++) printf(" "); printf("\n"); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("3.在顺序表中查找 *"); for (i=0; i< 10; i++) printf(" "); printf("\n"); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("4.向顺序表插入一个元素"); for (i=0; i< 2; i++) printf(" "); printf("*"); printf("\n"); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("5.删除顺序表的一个元素"); for (i=0; i< 2; i++) printf(" "); printf("*"); printf("\n"); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("6.读取顺序表中的元素"); for (i=0; i< 3; i++) printf(" "); printf("*"); printf("\n"); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("7.合并顺序表"); for (i=0; i< 7; i++) printf(" "); printf("*"); printf("\n"); for (i=0; i< 10; i++)printf(" "); printf("* "); printf("0.退 出 *"); for (i=0; i< 8; i++) printf(" "); printf("\n"); Output1(); } void main() //主函数 { int n, i, k=1, m, x; //定义相关字符 SqList L,La,Lc; //顺序表引用 InitList (&L); //链表引用 main1(); //跳转展示菜单 while (k) //循环选择 { printf("请选择0--- 7: "); scanf ("%d", &m); getchar(); switch (m) { case 0: return; case 1: { printf ("构建顺序表:\n"); printf("请输人顺序表元素的个数:"); scanf ("%d", &n); CreatSqlist(&L,n); //建立长度为n的顺序表L Output(&L); //输出表L break; } case 2: Output(&L); printf("\n"); break; case 3: { printf("请输入要查找的元素值: "); scanf ("%d", &x); k= LocateElem(&L,x); //调用查找函数 printf ("要查找的元素的定位:%d\n", k ); printf("\n"); break; } case 4: { printf ("输入要插入元素的位置和值: " ); fflush(stdin); //清理当前缓存 scanf ("%d",&i); //记录插入函数值 scanf ("%d",&x); //记录插入位置 Insert (&L, x,i); //调用插入函数 Output(&L); //输出 printf("\n"); break; } case 5: { printf ("输入要删除元素的位置: "); fflush(stdin); scanf ("%d",&i); Delete(&L,i); //调用删除函数 Output(&L); break; } case 6: { printf ("请输入要取出的元素的序号: "); fflush(stdin); scanf ("%d",&i); k=GetElem(&L,i); //取表中第i个元素 printf("取出的第%d个元素为:%d\n", i, k) ; break; } case 7: { InitList(&La); printf ("请输入第2个顺序表元素的个数: "); scanf ("%d", &m); CreatSqlist(&La,m); //建立长度为m的顺序表L Output(&La); //输出表La MergeList(&L,&La,&Lc); printf ("输出合并后的顺序表中的元素:\n"); Output(&Lc); //输出表Lc break; } default: return; } printf("继续运行吗Y /N:"); fflush(stdin); scanf("%c",&k); if (k=='n'||k=='N') return; fflush(stdin); main1(); } }
如若全部读懂,对于初学者来说收益颇丰。