学习数据结构了,写下来,加深记忆。
第一篇:
//system("cls"); 控制台屏幕刷新 #include<stdio.h> #include<string.h> #include<malloc.h> #define MAXSIZE 100 typedef int DataType; typedef struct { DataType data[MAXSIZE]; int length; }SeqList; //初始化顺序表 SeqList SeqListInit( ) { SeqList L; //cout<<"线性表以创建"<<endl; L.length = 0; return L; } // 销毁顺序表 SeqList ListClear(SeqList L) { L.length=0; //cout<<"线性表已销毁"<<endl; return L; } //判断顺序表是否为空表 int ListEmpty(SeqList L) { return (L.length==0); } //判断顺序表是否为满 int ListFull(SeqList L) { return (L.length==MAXSIZE); } //求顺序表长度 int ListLength(SeqList L) { return L.length; } //从顺序表中查找元素 DataType ListGet(SeqList L ,int i) { if(i<0||i>L.length-1) return -1;// 超出表范围,错误,返回-1 return L.data[i-1];//顺序表元素下标从0开始 } //从顺序表中查找与给定元素值相同的元素在顺序表中的位置 int ListLocate(SeqList L, DataType x) { int i,mun = -1; for(i = 0;i<L.length;i++) { if(L.data[i]==x) { mun = i; } } if(mun==-1) { printf("当前顺序表没有元素 %d \n",x); return -1; } else return mun+1; } // 向顺序表中插入元素 SeqList ListInsert1(SeqList L,DataType x) { if(L.length==MAXSIZE) printf("表满,错误\n");// 表满,返回错误 L.length++; L.data[L.length-1] = x; return L; } SeqList ListInsert(SeqList L,int i,DataType x) { int j; if(L.length>MAXSIZE) printf("表满,错误\n");// 表满,返回错误 for(j = L.length-1;j>=i;j--) { L.data[j] = L.data[j-1]; } L.length++; L.data[i-1] = x; return L; } /* 从顺序表中删除元素 */ SeqList ListDelete(SeqList L,int i) //i 认为是逻辑结构的位置,即从1开始 { int j; if(i<1||i>L.length) { printf("错误\n");// 表空,返回错误 return; } for(j = i;j<L.length;j++) L.data[j-1] = L.data[j]; L.length--; return L; } /*求顺序表中元素的前驱*/ void ListPrior (SeqList L,DataType e) { DataType i,k = -1; if(L.data[0] == e) { printf("顺序表第一个元素没有前驱\n"); return ;// 顺序表第一个元素没有前驱 } for(i = 1;i<L.length;i++) if(e == L.data[i]) k = i-1; if(k==-1) { printf("顺序表中没有元素 %d \n",e); return ; } else printf("元素 %d 的前驱为 %d \n",e,L.data[k]); } /*求顺序表中元素的后继*/ void ListNext(SeqList L,DataType e) { DataType i,k = -1; if(L.data[L.length-1] == e) { printf("顺序表最后一个元素没有后继 \n");// 顺序表最后一个元素没有后继 return ; } for(i = 0;i<L.length-1;i++) if(e == L.data[i]) k = i+1; if(k==-1) { printf("顺序表中没有元素 %d \n",e); return ; } else printf("元素 %d 的后继为 %d \n",e,L.data[k]); } //输出顺序表(遍历顺序表 ) void Prinlist(SeqList L) { int i; for(i = 0;i<L.length;i++) printf("%d ",L.data[i]); printf("\n"); } void mainScreen() { printf("请输入序号以使用以下功能 \n"); printf("0. 退出程序\n"); printf("1. 建立顺序表\n"); printf("2. 插入元素,输入元素 x \n"); printf("3. 插入元素,输入元素 x , 插入位置 i \n"); printf("4. 删除位置为 i 的元素\n"); printf("5. 判断顺序表是否为空 \n"); printf("6. 判断顺序表是否为满 \n"); printf("7. 查询顺序表长度 \n"); printf("8. 遍历顺序表 \n"); printf("9. 查询元素 x 位置 ,输入 x\n"); printf("10. 查询位置为 i 元素,输入 i \n"); printf("11. 查询元素 x 的前驱,输入 x \n"); printf("12. 查询元素 x 的后继,输入 x \n"); printf("13. 销毁顺序表\n"); printf("__________________________________________\n"); } int main() { int n,x,i,tem; mainScreen(); SeqList L; while(scanf("%d",&n)&&n!=0) { switch(n) { case 1: system("cls"); L = SeqListInit(); printf("顺序表已经建立!!\n"); //printf("输入 任意数字 返回主菜单\n"); //scanf("%d",&temp); getchar(); getchar(); system("cls"); mainScreen(); break; case 2: system("cls"); printf("插入元素,请输入元素 x "); scanf("%d",&x); L = ListInsert1(L,x); printf("元素 %d 已插入 \n",x); getchar(); getchar(); system("cls"); mainScreen(); break; case 3: system("cls"); printf("插入元素,请输入元素 x 及序号 i "); scanf("%d%d",&x,&i); L = ListInsert(L,x,i); printf("元素 %d 已插入 \n",x); getchar(); getchar(); system("cls"); mainScreen(); break; case 4: system("cls"); printf("删除位置为 i 的元素,请输入 i "); scanf("%d",&i); int tem = L.length; L = ListDelete(L,i); if(tem==L.length) { getchar(); getchar(); system("cls"); mainScreen(); continue; } else { printf("%d 位置已删除 \n",i); getchar(); getchar(); system("cls"); mainScreen(); break; } case 5: system("cls");// empty if(ListEmpty(L)) printf("顺序表为空!!\n"); else printf("顺序表不为空!!\n"); getchar(); getchar(); system("cls"); mainScreen(); break; case 6: system("cls");// full if(ListFull(L)) printf("顺序表为满!!\n"); else printf("顺序表不为满!!\n"); getchar(); getchar(); system("cls"); mainScreen(); break; case 7: system("cls"); x = ListLength(L); printf("顺序表长度为 %d \n",x); getchar(); getchar(); system("cls"); mainScreen(); break; case 8: system("cls"); printf("遍历顺序表\n"); Prinlist(L); getchar(); getchar(); system("cls"); mainScreen(); break; case 9 :system("cls"); printf("查询元素 x 位置 ,输入 x"); scanf("%d",&x); i = ListLocate(L,x); printf("元素 %d 位置为 %d \n",x,i ); getchar(); getchar(); system("cls"); mainScreen(); break; case 10:system("cls"); printf("查询位置为 i 元素,输入 i "); scanf("%d",&i); x = ListGet(L,i); printf("位于位置 %d 的元素为为 %d \n",i,x); getchar(); getchar(); system("cls"); mainScreen(); break; case 11: system("cls"); printf("查询元素 x 的前驱, 请输入 x "); scanf("%d",&x); ListPrior(L,x); getchar(); system("cls"); mainScreen(); break; case 12:system("cls"); printf("查询元素 x 的后继, 请输入 x "); scanf("%d",&x); ListNext(L,x); getchar(); system("cls"); mainScreen(); break; case 13:system("cls"); printf("销毁顺序表 "); L = ListClear(L); printf("顺序表已销毁 "); getchar(); system("cls"); mainScreen(); break; default:printf("error");break; } } return 0; }