实验实现单链表各种基本运小组合作 题目 姓名 算的算法 班级 学 号 无 一、 实验目的 领会单链表存储结构和掌握单链表中各种基本运算算法设计 二.实验环境 Miscroft Visual C++6.0环境。 三.实验内容与步骤 1.编写linklist.cpp程序包含有关单链表运算算法 2.编写exp2-2.cpp程序包含有关程序代码 3.运行程序exp2-2.cpp,得到结果 四、实验过程与分析 //单链表运算算法 #include #include typedef char ElemType; typedef struct LNode a { ElemType data; struct LNode *next; //指向后继结点 } LinkNode; //单链表结点类型 void CreateListF(LinkNode *&L,ElemType a[],int n) //头插法建立单链表 { LinkNode *s; L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点 L->next=NULL; for (int i=0;idata=a[i]; s->next=L->next; //将结点s插在原开始结点之前,头结点之后 } void CreateListR(LinkNode *&L,ElemType a[],int n) //尾插法建立单链表 { } L->next=s; LinkNode *s,*r; L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点 L->next=NULL; r=L; //r始终指向尾结点,开始时指向头结点 for (int i=0;idata=a[i]; r->next=s; //将结点s插入r结点之后 } r->next=NULL; r=s; //尾结点next域置为NULL } 实验截图(1) void InitList(LinkNode *&L) //初始化线性表 { L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点 L->next=NULL; //单链表置为空表 } void DestroyList(LinkNode *&L) //销毁线性表 { LinkNode *pre=L,*p=pre->next; while (p!=NULL) { free(pre); pre=p; //pre、p同步后移一个结点 } free(pre); p=pre->next; //此时p为NULL,pre指向尾结点,释放它 } bool ListEmpty(LinkNode *L) //判线性表是否为空表 { } int ListLength(LinkNode *L) //求线性表的长度 { int i=0; LinkNode *p=L; return(L->next==NULL); //p指向头结点,n置为0(即头结点的序号为0) while (p->next!=NULL) { i++; p=p->next; } return(i); //循环结束,p指向尾结点,其序号i为结点个数 } void DispList(LinkNode *L) //输出线性表 { LinkNode *p=L->next; //p指向首结点 while (p!=NULL) //p不为NULL,输出p结点的data域 { printf(\"%c \ p=p->next; //p移向下一个结点 } } printf(\"\\n\"); 实验截图(2) bool GetElem(LinkNode *L,int i,ElemType &e) //求线性表中第i个元素值 { int j=0; if (i<=0) return false; //i错误返回假 LinkNode *p=L; //p指向头结点,j置为0(即头结点的序号为0) while (jnext; //不存在第i个数据结点,返回false return false; else //存在第i个数据结点,返回true } int LocateElem(LinkNode *L,ElemType e) //查找第一个值域为e的元素序号 { int i=1; LinkNode *p=L->next; { e=p->data; } return true; //p指向首结点,i置为1(即首结点的序号为1) while (p!=NULL && p->data!=e) //查找data值为e的结点,其序号为i { p=p->next; } if (p==NULL) i++; //不存在值为e的结点,返回0 return(0); else //存在值为e的结点,返回其逻辑序号i } return(i); 实验截图(3) bool ListInsert(LinkNode *&L,int i,ElemType e) //插入第i个元素 { int j=0; if (i<=0) return false; //i错误返回假 LinkNode *p=L,*s; //p指向头结点,j置为0(即头结点的序号为0) while (jnext; if (p==NULL) //未找到第i-1个结点,返回false return false; else //找到第i-1个结点p,插入新结点并返回true { s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=e; //创建新结点s,其data域置为e s->next=p->next; //将结点s插入到结点p之后 } bool ListDelete(LinkNode *&L,int i,ElemType &e) //删除第i个元素 { int j=0; if (i<=0) return false; } p->next=s; return true; //i错误返回假 LinkNode *p=L,*q; //p指向头结点,j置为0(即头结点的序号为0) while (jnext; //未找到第i-1个结点,返回false return false; else //找到第i-1个结点p { q=p->next; //q指向第i个结点 if (q==NULL) //若不存在第i个结点,返回false return false; e=q->data; p->next=q->next; //从单链表中删除q结点 free(q); //释放q结点 return true; //返回true表示成功删除第i个结点 } } 实验截图(4) 编写exp2-2.cpp程序包含有关代码 //文件名:exp2-2.cpp #include \"linklist.cpp\" int main() { LinkNode *h; ElemType e; printf(\"单链表的基本运算如下:\\n\"); printf(\" (1)初始化单链表h\\n\"); InitList(h); printf(\" (2)依次采用尾插法插入a,b,c,d,e元素\\n\"); ListInsert(h,1,'a'); ListInsert(h,2,'b'); ListInsert(h,3,'c'); ListInsert(h,4,'d'); ListInsert(h,5,'e'); printf(\" (3)输出单链表h:\"); DispList(h); printf(\" (4)单链表h长度:%d\\n\printf(\" (5)单链表h为%s\\n\空\":\"非空\")); GetElem(h,3,e); printf(\" (6)单链表h的第3个元素:%c\\n\printf(\" (7)元素a的位置:%d\\n\printf(\" (8)在第4个元素位置上插入f元素\\n\"); ListInsert(h,4,'f'); printf(\" (9)输出单链表h:\"); DispList(h); printf(\" (10)删除h的第3个元素\\n\"); ListDelete(h,3,e); printf(\" (11)输出单链表h:\"); DispList(h); printf(\" (12)释放单链表h\\n\"); DestroyList(h); } return 1; 实验截图(5) 运行得到结果 实验截图(6) 五.实验总结 通过这次实验,我的收获如下: 1.进行编程时,要在感到模糊的地方进行备注,方便在报错的时候进行修改。 2.要保持linklist.cpp程序中的函数名与exp2-2.cpp程序中的函数名完全一致,特别是大小写部分要特别注意。 3.领会到了单链表存储的大体结构 4.了解了在单链表中各种基本运算算法设计