一、实验环境
VC++ 6.0
Windows XP/7
二、程序基本设计
(一)、存储结构的类型定义
typedef struct LNode /*定义单链表结点类型*/ { ElemType data; struct LNode *next; } LinkList;
(二)、单链表示意图
(三)、项目组成图
(四)、在项目中建立algo2_2.cpp的程序文件
其中包含的函数原型及功能是:
详情见代码,略去,,几百字。。
(五)、在实验一的项目中,建立名为exp2_2.cpp程序文件
其中包括的内容为:
详情见代码,略去几十字。。。。
(六)、实验一的项目的模块结构,及函数调用关系图
三、程序代码
代码如下:
/*文件名:algo2-2.cpp*/ #include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct LNode /*定义单链表结点类型*/ { ElemType data; struct LNode *next; } LinkList; void InitList(LinkList *&L) { L=(LinkList *)malloc(sizeof(LinkList)); /*创建头结点*/ L->next=NULL; } void DestroyList(LinkList *&L) { LinkList *p=L,*q=p->next; while (q!=NULL) { free(p); p=q; q=p->next; } free(p); } int ListEmpty(LinkList *L) { return(L->next==NULL); } int ListLength(LinkList *L) { LinkList *p=L;int i=0; while (p->next!=NULL) { i++; p=p->next; } return(i); } void DispList(LinkList *L) { LinkList *p=L->next; while (p!=NULL) { printf("%c",p->data); p=p->next; } printf(" "); } int GetElem(LinkList *L,int i,ElemType &e) { int j=0; LinkList *p=L; while (j<i && p!=NULL) { j++; p=p->next; } if (p==NULL || i<1) // 当超出上界或者下界时,查询失败 { printf("您输入的元素位置数据不合法! "); return 0; } else { e=p->data; return 1; } } int LocateElem(LinkList *L,ElemType e) { LinkList *p=L->next; int n=1; while (p!=NULL && p->data!=e) { p=p->next; n++; } if (p==NULL) return(0); else return(n); } int ListInsert(LinkList *&L,int i,ElemType e) { int j=0; LinkList *p=L,*s; while (j<i-1 && p!=NULL) { j++; p=p->next; } if (p==NULL || i<=0) /*未找到第i-1个结点*/ { printf("插入失败! "); return 0; } else /*找到第i-1个结点*p*/ { s=(LinkList *)malloc(sizeof(LinkList)); /*创建新结点*s*/ s->data=e; s->next=p->next; /*将*s插入到*p之后*/ p->next=s; printf("插入完成! ") ; return 1; } } int ListDelete(LinkList *&L,int i,ElemType &e) { int j=0; LinkList *p=L,*q; while (j<i-1 && p!=NULL) { j++; p=p->next; } if (p==NULL || i <1 ||q==NULL ) /*未找到第i-1个结点*/ { return 0; } else /*找到第i-1个结点*p*/ { q=p->next; /*q指向要删除的结点*/ e=q->data; p->next=q->next; /*从单链表中删除*q结点*/ free(q); /*释放*q结点*/ return 1; } }
/*文件名:exp2-2.cpp*/ #include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct LNode /*定义单链表结点类型*/ { ElemType data; struct LNode *next; } LinkList; extern void InitList(LinkList *&L); extern void DestroyList(LinkList *&L); extern int ListEmpty(LinkList *L); extern int ListLength(LinkList *L); extern void DispList(LinkList *L); extern int GetElem(LinkList *L,int i,ElemType &e); extern int LocateElem(LinkList *L,ElemType e); extern int ListInsert(LinkList *&L,int i,ElemType e); extern int ListDelete(LinkList *&L,int i,ElemType &e); void main() { int pos; LinkList *h; ElemType e; char ele; printf("(1)初始化单链表h "); InitList(h); printf(" (2)依次采用尾插法插入a,b,c元素 "); ListInsert(h, 1, 'a'); ListInsert(h, 2, 'b'); ListInsert(h, 3, 'c'); printf(" (3)输出单链表h:"); DispList(h); printf(" (4)单链表h长度=%d ",ListLength(h)); printf(" (5)单链表h为%s ",(ListEmpty(h)?"空":"非空")); Sur:printf(" (6)请输入你要查询的数据元素的位置(数字):"); scanf("%d", &pos) ; if(GetElem(h,pos,e)) { printf("单链表h的第%d个元素=%c ", pos, e); } else { printf("查询失败! "); SurEle: printf("你是否要继续查询?(Y/N)") ; getchar(); scanf("%c", &ele) ; switch (ele) { case 'Y': case 'y': goto Sur ; break; case 'N': case 'n': printf("您选择放弃再次查询! ") ; break; default: printf("您输入的数据不合法!请重新输入: "); goto SurEle ; break; } } SurCon:printf(" (7)请输入你要查找的数据元素的值:") ; getchar(); scanf("%c", &e) ; if (LocateElem(h,e)) { printf("查找成功,元素%c的位置=%d ", e, LocateElem(h,e)); } else { printf("查询失败!你输入的数据元素的值不存在! ") ; SurConEle: printf("你是否要继续查询?(Y/N)") ; getchar(); scanf("%c", &ele) ; switch (ele) { case 'Y': case 'y': goto SurCon ; break; case 'N': case 'n': printf("您选择放弃再次查询! ") ; break; default: printf("您输入的数据不合法!请重新输入: "); goto SurConEle ; break; } } printf(" (8)请输入你要插入的数据元素的位置和数据元素值(以逗号隔开):"); scanf("%d,%c", &pos, &e); if (ListInsert(h, pos, e)) { printf("输出成功插入元素后的单链表h:"); DispList(h); } Dle:printf(" (10)请输入你要删除的数据元素的位置:"); //getchar(); scanf("%d", &pos) ; if(ListDelete(h,pos,e)) { printf("删除成功!你删除的位置的数据元素值为%c ", e) ; printf("输出成功删除元素后单链表h:"); DispList(h); printf("你是否要继续删除?(Y/N)") ; getchar(); scanf("%c", &ele) ; switch (ele) { case 'Y': case 'y': goto Dle ; break; case 'N': case 'n': printf("您选择不再继续删除! ") ; break; default: printf("您输入的数据不合法!请重新输入: "); goto Dle ; break; } } else { printf("删除失败!请检查你输入的数据元素的位置! ") ; DleEle: printf("你是否要继续再次尝试删除?(Y/N)") ; getchar(); scanf("%c", &ele) ; switch (ele) { case 'Y': case 'y': goto Dle ; break; case 'N': case 'n': printf("您选择放弃尝试删除! ") ; break; default: printf("您输入的数据不合法!请重新输入 "); goto DleEle ; break; } } printf(" (12)释放单链表h "); DestroyList(h); }