我的线性表(顺序表)
啦啦啦……写了将近一上午,功能不太全,只写了老师要求写的功能,待会儿我把其他功能补充下再粘贴一个
这个只有1:定义线性表,2:初始化线性表,3:删除第i个位置的元素,4:删除值为e的元素,5:查找第i个位置上的元素,6:打印顺序表 7:销毁顺序表
#include <stdio.h> #include <malloc.h> #define LISTINCREMENT 10 typedef struct { int *elem; int length; int listsize; }SqList; void printMenu();//打印功能选择菜单 bool initListSq(SqList &L, int len); //初始化线性表,成功则返回1,失败返回0 bool listInsertSq(SqList &L, int i, int e);//在线性表的第i个位置插入元素e bool listDataDeleteSq(SqList &L, int &i, int e); //删除顺序表中元素e,并返回它的位置i bool listLocationDeleteSq(SqList &L, int i, int &e);//删除顺序表中第i个位置的元素,并返回元素的值e bool locateElemSq(SqList &L, int &i, int e);//查找某个元素,找到则返回它的位置,否则返回0 void listPrintSq(SqList &L); //打印该线性表 void destorySq(SqList &L); //销毁该线性表 void printMenu() { printf(" 请选择对该线性表的操作:\n"); printf("1:插入一个元素\n"); printf("2:删除顺序表中第i个元素,并输出它的值e\n"); printf("3:删除顺序表中的元素e,并输出其位置\n"); printf("4:查找某个元素,找到则输出它的位置,否则输出0\n"); printf("5:打印该顺序表\n"); printf("6:销毁该顺序表\n"); printf("q:退出程序\n"); } int main() { int len, quik = 0; SqList La; char choice; printf("请输入建立的顺序表的元素个数:"); scanf("%d", &len); initListSq(La, len); for(;;) //用户在选择退出之前可以根据菜单随意对线性表进行操作; { int i, e; bool check; printMenu(); getchar(); scanf("%c", &choice); switch(choice) { case '1': printf("请输入要插入的元素位置和元素的值:(1 <= i <= %d)", La.length+1); scanf("%d%d", &i, &e); check = listInsertSq(La, i, e); if(check) printf("插入成功!\n"); else printf("插入失败!(请检查输入的位置是否在合法范围)\n"); break; case '2': printf("请输入要删除的元素的位置:"); scanf("%d", &i); check = listLocationDeleteSq(La, i, e); if(check) printf("删除成功!\n"); else printf("删除失败!(请检查输入的位置的范围或者该表是否为空)\n"); break; case '3': printf("请输入要删除的元素的值:"); scanf("%d", &e); check = listDataDeleteSq(La, i, e); if(check == 1) printf("删除成功!\n"); else printf("删除失败!(请检查您输入的值是否存在于线性表中)"); break; case '4': printf("请输入要查找的元素:"); scanf("%d", &e); check = locateElemSq(La, i, e); if(check) printf("找到了,该元素在线性表中的第%d个位置上\n", i); else printf("sorry, 没找到哎,要不您再检查一下输入的元素是否是线性表中的元素?"); case '5': listPrintSq(La); break; case '6': destorySq(La); printf("销毁完成!\n"); case 'q': quik = 1;break; default: printf("您输入的数字不在范围内,请重新输入\n"); } if(quik) { printf("感谢您的使用,再见\n"); break; } } return 0; } bool initListSq(SqList &L, int len) //构造一个空的线性表,成功则返回1,失败返回0 { L.elem = (int *)malloc(len*sizeof(int)); if(!L.elem) exit(0); L.length = 0; L.listsize = len; return 1; } bool listInsertSq(SqList &L, int i, int e) { //在顺序线性表中第i个位置插入新的元素e //i的范围 1 <= i <= L.listsize + 1 if(i < 1 || i > L.length+1) return 0; if(L.length >= L.listsize) { int *newbase = (int *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(int)); if(!newbase) exit(0); //存储分配失败 L.elem = newbase; L.listsize += LISTINCREMENT; } int *q = &(L.elem[i-1]), *p; for(p = &(L.elem[L.length-1]); p >= q; p--) *(p+1) = *p; *q = e; ++L.length; return 1; } bool listLocationDeleteSq(SqList &L, int i, int &e)//删除顺序表中第i个位置上的元素,并用e返回其值 { //i的范围:1 <= i <= L.listsize; if(L.length == 0) return 0; if(i < 1 || i > L.listsize) return 0; int *p = &(L.elem[i-1]), *q; e = *p; q = L.elem + L.listsize; for(p++; p < q; p++) *(p-1) = *p; --L.length; return 1; } bool locateElemSq(SqList &L, int &i, int e)//查找某个元素,找到则返回它的位置,否则返回0 { if(L.length == 0) return 0; i = 1; while(i <= L.length && L.elem[i-1] != e) ++i; if(i <= L.length) return 1; else return 0; } bool listDataDeleteSq(SqList &L, int &i, int e)//删除顺序表中值为e的元素,并用i返回它的位置 { if(L.length == 0) return 0; int i1; bool flag; flag = locateElemSq(L, i1, e); if(flag) { listLocationDeleteSq(L, i1, e); return 1; } else return 0; } void listPrintSq(SqList &L) //打印该线性表 { if(L.length == 0) {printf("该顺序表为空\n"); return ;} printf("该顺序表如下:\n"); for(int i = 0; i < L.length; i++) { printf("%d ", L.elem[i]); if(i != 0 && i % 6 == 0) printf("\n"); } printf("\n"); } void destorySq(SqList &L) //销毁该线性表 { free(L.elem); }