求严蔚敏《数据结构》中包含初始化,插入,删除的完整调试程序?
求严蔚敏《数据结构》中包含初始化,插入,删除的完整调试程序?
#include<stdio.h> #include<stdlib.h> #include<conio.h> #define Status int #define ElemType int #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct{ ElemType *elem; int length; int listsize; }SqList; Status InitList_sq(SqList &L) { //初始化一个顺序表 L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem) //存储分配失败 exit(OVERFLOW); L.length=0; //初始长度0 L.listsize=LIST_INIT_SIZE; //初始容量 return OK; }//InitList_sq void DestroyList_sq(SqList &L) { //销毁顺序表 free(L.elem); L.elem=NULL; L.length=0; L.listsize=0; }//DestroyList_sq Status ListInsert_sq(SqList &L,int i,ElemType e) { //插入记录到顺序表 if(i<1 || i>L.length+1) { printf("输入不合法!!\n"); return ERROR; //i的值不合法 } if(L.length>=L.listsize) { ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase) //分配失败 exit(OVERFLOW); L.elem=newbase; //新基址 L.listsize+=LISTINCREMENT; //增加存储容量 } ElemType *q = &(L.elem[i-1]); //q为插入位置 for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p) *(p+1) = *p; //插入位置及之后的元素右移 *q = e; //插入e ++L.length; return OK; }//ListInsert_sq void Add(SqList &L) { //添加到列表尾 char c; ElemType e; do { printf("\n请输入一条数据(整数):"); scanf("%d",&e); ListInsert_sq(L,L.length+1,e); //尾添加 printf("\n是否继续输入(按y继续)?"); c=getche(); putchar('\n'); }while(c=='y'); }//Add void Insert(SqList &L) { //插入到指定位置 char c; ElemType e; int i; do { printf("\n请输入一条数据(整数):"); scanf("%d",&e); do { i=L.length; printf("请输入插入位置1 ~ %d:",i+1); scanf("%d",&i); }while(ListInsert_sq(L,i,e)==0); //插入位置不正确 printf("\n是否继续输入(按y继续)?"); c=getche(); putchar('\n'); }while(c=='y'); }//Insert void OutputList_sq(SqList &L) { //输出所有记录 int l=L.length; if(l!=0) { printf("所有记录如下:\n"); for(int i=0;i<L.length;i++) printf("%d\n",L.elem[i]); } else printf("表为空!\n\n"); }//OutputList_sq Status ListEmpty_Sq(SqList &L) { //判断顺序表是否为空 if(L.length == 0) return TRUE; else return FALSE; }//ListEmpty_Sq int ListLength_Sq(SqList &L) { //求长度 return L.length; }//ListLength_Sq Status ListDelete_Sq(SqList &L,int i,ElemType &e){ //在线性顺序表中删除第i个元素,并用e返回其值 //i的合法值为1<=i=<ListLength_Sq(L) if ((i<1) || (i>L.length)) { printf("输入不合法!!!"); return ERROR; } ElemType *p = &(L.elem[i-1]); e = *p; ElemType *q = L.elem+L.length-1; for(++p; p<= q; ++p) *(p-1) = *p; --L.length; return OK; }//ListDelete_Sq void Delete(SqList &L) { //删除指定位置 ElemType a; int i; printf("\n请输入删除位置(非正数则退出):"); scanf("%d",&i); while(i>0) { if(ListDelete_Sq(L,i,a)!=0) //如果成功删除 printf("您删除了第%d条记录< %d >\n",i,a); printf("\n请输入删除位置(非正数则退出):"); scanf("%d",&i); } }//Delete Status GetElem(SqList &L,int i,ElemType &e) { //获得指定位置记录 if ((i<1) || (i>L.length)) { printf("输入不合法!!!"); return ERROR; } e=L.elem[i-1]; return OK; }//GetElem void Get(SqList &L) { //获得指定位置输入 ElemType a; int i; printf("\n请输入查找位置(非正数则退出):"); scanf("%d",&i); while(i>0) { if(GetElem(L,i,a)!=0) printf("第%d个元素为< %d >\n",i,a); printf("\n请输入查找位置(非正数则退出):"); scanf("%d",&i); } }//Get void ClearList(SqList &L) { //清空顺序表 L.length=0; }//ClearList int LocateElem(SqList &L,ElemType e) { //查找某记录出现的第一次位置 for(int i=1;i<=L.length;i++) if(L.elem[i-1]==e) break; if(i>L.length) i=0; return i; }//LocateElem void Locate(SqList &L) { //输入要查找的某记录 char c; ElemType a; int i; do { printf("\n请输入一条待查询记录(整数):"); scanf("%d",&a); i=LocateElem(L,a); if(i==0) printf("不存在此记录!!\n"); else printf("%d是第%d条记录!!\n",a,i); printf("\n是否继续查询记录(按y继续)?"); c=getche(); putchar('\n'); }while(c=='y'); }//Locate int main() { SqList L; InitList_sq(L); //自动初始化顺序表 while(1) { system("cls"); printf("\t0、输出所有记录\n"); printf("\t1、销毁顺序表\n"); printf("\t2、判断表空\n"); printf("\t3、测量表长\n"); printf("\t4、添加记录\n"); printf("\t5、插入记录\n"); printf("\t6、删除记录\n"); printf("\t7、查询记录\n"); printf("\t8、清空顺序表\n"); printf("\t9、取指定位置记录\n"); char c=getch(); while(c>'9' || c<'0') c=getch(); printf("您选择了%c:\n\n",c); switch(c) { case '0':OutputList_sq(L); system("Pause");break; case '1':DestroyList_sq(L); printf("线性表已销毁!\n\n"); InitList_sq(L); //销毁将重新初始化顺序表 printf("线性表已初始化!\n\n"); system("Pause");break; case '2': if(ListEmpty_Sq(L)==1) printf("顺序表为空!!\n\n"); else printf("顺序表不为空!!\n\n"); system("Pause"); break; case '3': printf("顺序表的长度为: %d\n\n",ListLength_Sq(L)); system("Pause");break; case '4':Add(L);break; case '5':Insert(L);break; case '6':Delete(L);break; case '7':Locate(L);break; case '8':ClearList(L); printf("线性表已清空!\n\n"); system("Pause");break; case '9':Get(L);break; default:break; } } return 0; }