数据结构教程(第二版)课后答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验题 2.2 编写一个程序algo2-2.cpp,实现单链表的各种基本运算,并在此基础上设计一个主程序完成如下功能。
(1)初始化单链表h;
(2)依次采用尾插法插入a,b,c,d,e元素;
(3)输出单链表h;
(4)输出单链表h长度;
(5)判断单链表h是否为空;
(6)输出单链表h的第3个元素;
(7)输出元素a的位置;
(8)在第4个元素位置上插入‘f’元素;
(9)输出单链表h;
(10)删除h的第3个元素;
(11)输出单链表h;
(12)释放单链表h;
程序:
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define NULL 0
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList_h(LinkList &h) { //初始化线性表
h=(LinkList )malloc(sizeof(LNode)); //h指向头节点,头节点数据域为空
h->next=NULL;
return OK;
}// InitList_h
Status DispList_h(LinkList &h) { //输出线性表
LinkList p=h->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
return OK;
} // DispList_h
Status CreateList_h(LinkList &h,ElemType a[],int n) { //尾插法建表LinkList s,r;int i;
h=(LinkList )malloc(sizeof(LNode));
r=h;
for(i=0;i { s=(LinkList )malloc(sizeof(LNode)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; return OK; }// CreateList_h Status ListLength_h(LinkList h) { //求线性表的长度LinkList p=h;int n=0; while(p->next!=NULL) { n++; p=p->next; } return(n); }// ListLength_h Status ListEmpty_h(LinkList h) { //判断单链表是否为空return(h->next==NULL); }// ListEmpty_h Status DestroyList_h(LinkList &h) { //销毁线性表 LinkList p=h,q=p->next; while(q!=NULL) { free(p); p=q; q=p->next; } free(p); return OK; }// DestroyList_h Status GetElem_h(LinkList h, int i, ElemType &e) { // h为带头节点的单链表的头指针。 // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR int j=0; LinkList p=h; while(j { j++;p=p->next; } if(p==NULL) { return ERROR; } else { e=p->data; return OK; } }// GetElem_h Status ListInsert_h(LinkList &h, int i, ElemType e) { //插入数据元素 int j=0; LinkList p=h,s; /* 找到插入节点的上一个元素,如果是头节点则退出,当i=1时表示头节点,i=2时,表示第一个元素 */ while(j { j++; p=p->next; } if(p==NULL) { return ERROR; } else { s=(LinkList )malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return OK; } }// ListInsret_h Status ListDelete_h(LinkList &h, int i, ElemType &e) { //删除数据元素int j=0; LinkList p=h,q; while(j { j++; p=p->next; } if(p==NULL) { return ERROR; } else { q=p->next; //q为要删除的元素节点 if(q==NULL) { return ERROR; } e=q->data; //e为删除节点的数据区域 p->next=q->next; free(q); return OK; } }// ListDelete_h int LocateElem_h(LinkList h, ElemType e) { //按元素值查找元素LinkList p=h->next; int i=1; while(p!=NULL&&p->data!=e) { p=p->next;i++; } //如果要插入的节点为头节点,则退出 if(p==NULL) { return ERROR; } else { return(i);