带头结点的单链表(一)
北京邮电大学 数据结构 实验一 带头结点的单链表构造

数据结构实验报告实验名称:实验1——单链表的构造学生姓名:XXXXNB班级:XXXX班内序号:学号:XXXX日期:XXXXX1.实验要求根据线性表的抽象数据类型的定义,完成带头结点的单链表的基本功能。
单链表的基本功能:1、构造:使用头插法、尾插法两种方法2、插入:要求建立的链表按照关键字从小到大有序3、删除4、查找5、获取链表长度6、销毁7、其他:可自行定义编写测试main()函数测试线性表的正确性。
2.程序分编程完成单链表的一般性功能如单链表的构造:使用头插法、尾插法两种方法插入:要求建立的链表按照关键字从小到大有序,删除,查找,获取链表长度,销毁用《数据结构》中的相关思想结合C++语言基本知识编写一个单链表结构。
本程序为使用方便,几乎不用特殊的命令,只需按提示输入即可,适合更多的用户使用。
2.1 存储结构单链表的存储结构:2.2 关键算法分析1.头插法自然语言描述:a.在堆中建立新结点b.将a[i]写入到新结点的数据域c.修改新结点的指针域d.修改头结点的指针域,将新结点加入链表中//在构建之初为了链表的美观性构造,进行了排序代码描述://头插法构造函数template<class T>LinkList<T>::LinkList(T a[], int n){for (int i = n - 1; i >= 1; i--)//冒泡排序,对数组进行从小到大排序{for (int j = 0; j < i; j++){if (a[j]>a[j + 1]){T t = a[j + 1];a[j + 1] = a[j];a[j] = t;}}}front = new Node < T >;//为头指针申请堆空间front->next = NULL;//构造空单链表for (int i = n - 1; i >= 0; i--){Node<T>*s = new Node < T >;//建立新结点s->data = a[i];//将a[i]写入新结点的数据域s->next = front->next;//修改新结点的指针域front->next = s;//修改头结点的指针域,将新结点加入到链表中}}2.尾插法自然语言描述:a.在堆中建立新结点b.将a[i]写入到新结点的数据域c.将新结点加入到链表中d.修改修改尾指针代码描述://尾插法构造函数template<class T>LinkList<T>::LinkList(T a[], int n){front = new Node < T > ;Node<T>*r = front;//命名一个新变量进行转换for (int i = 0; i < n; i++){Node<T>*s = new Node < T > ;s->data = a[i];r->next = s;r = s;}r->next = NULL;}时间复杂度:O(n)3.析构函数自然语言描述:a.新建立一个指针,指向头结点b.移动a中建立的指针c.逐个释放指针代码描述:template<class T>LinkList<T>::~LinkList()//析构函数,销毁链表{Node<T> * p = front;while(p){front = p;p = p->next;delete front;}}4.按位查找函数自然语言描述: a.初始化工作指针p和计数器j,p指向第一个结点,j=1b.循环以下操作,直到p为空或者j等于1b1:p指向下一个结点b2:j加1c.若p为空,说明第i个元素不存在,抛出异常d.否则,说明p指向的元素就是所查找的元素,返回元素地址代码描述:template<class T>Node<T>* LinkList<T>::Get(int i)//按位查找{Node<T> * p = front;int j=0;while(p){if(j<i){p = p->next;j++;}else break;}if(!p) throw"查找位置非法";else return p;}时间复杂度:O(n)5.按值查找函数自然语言描述:a.初始化工作指针p和计数器j,p指向第一个结点,j=1b.循环以下操作,找到这个元素或者p指向最后一个结点b1.判断p指向的结点是不是要查找的值,如果是,返回j;b2.否则p指向下一个结点,并且j的值加一c.如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息代码描述:template<class T>int LinkList<T>::Locate(T x)//按值查找{Node<T> * p = front->next;int j = 1;while(p){if(p->data == x) return j;else{p = p->next;j++;}}return -1;}时间复杂度:O(n)6.插入函数自然语言描述:a.在堆中建立新结点b.将要插入的结点的数据写入到新结点的数据域c.修改新结点的指针域d.修改前一个指针的指针域,使其指向新插入的结点的位置代码描述:template<class T>void LinkList<T>::Insert(int i,T x)//插入函数{Node<T> * p = Get(i-1);if(p){Node<T> * s = new Node<T>;s->data = x;s->next = p->next;p->next = s;}else throw"插入位置非法";}时间复杂度:O(n)7.按位删除函数自然语言描述:a.从第一个结点开始,查找要删除的位数i前一个位置i-1的结点b.设q指向第i个元素c.将q元素从链表中删除d.保存q元素的数据e.释放q元素代码描述:template<class T>T LinkList<T>::Delete(int i)//删除函数{Node<T> *p = Get(i-1);Node<T> *q = p->next;T x=q->data;p->next = q->next;delete q;return x;}8.遍历打印函数自然语言描述: a.判断该链表是否为空链表,如果是,报错b.如果不是空链表,新建立一个temp指针c.将temp指针指向头结点d.打印temp指针的data域e.逐个往后移动temp指针,直到temp指针的指向的指针的next域为空代码描述:template<class T>void LinkList<T>::PrintList()//打印链表{Node<T> * p = front->next;while(p){cout<<p->data<<' ';p = p->next;}cout<<endl;}9.获取链表长度函数自然语言描述:a.判断该链表是否为空链表,如果是,输出长度0b.如果不是空链表,新建立一个temp指针,初始化整形数n为0c.将temp指针指向头结点d.判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则return ne.使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next 域为0,返回n代码描述:template<class T>int LinkList<T>::GetLength()//分析链表长度{Node<T> * p = front;int i=0;while(p){p = p->next;i++;}return i-1;}2.3 其他异常处理采用try catch 函数处理异常如在插入时的异常处理:template<class T>void LinkList<T>::Insert(int i, T x){Node<T>*p = front;if (i != 1) p = Get(i - 1);try{if (p){Node<T>*s = new Node < T > ;s->data = x;s->next = p->next;p->next = s;}else throw i;}catch (int i){cout << "插入到位置 " << i << " 处" << "为错误位置"<<endl;}}3. 程序运行结果主函数流程图:测试截图:初始化链表,菜单创建执行功能:4. 总结.调试时出现了一些问题如:异常抛出的处理,书中并未很好的提及异常处理,通过查阅资料,选择用try catch 函数对解决。
南京大学《数据结构》试卷(含答案)

(1+7+1+1+2+1+4+1+1) / 9 = 19/9
得分
5、 程序设计题。(每小题 15 分,本题满分 30 分)
1. 设计一个算法,根据一棵二叉树的前序序列和中序序列,构造出这棵二叉
树。 二叉树的结点都用字符表示。前序序列和中序序列都是字符串。二叉树的结点定
义如下:
struct binTreeNode {char data; binTreeNode *leftChild, *rightChild; }
考试科目名称
数据结构
得分
1、填空题。(每小题 2 分,本题满分 20 分)
(A1 卷)
(1) C++语言中,数组是按行优先顺序存储的,假设定义了一个二维数组 A[20][30],每个元
素占两个字节,其起始地址为 2140,则二维பைடு நூலகம்组 A 的最后一个数据元素的地址为
《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

第1章4.答案:(1)顺序存储结构顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。
(2)链式存储结构顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。
但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。
所以链式存储结构通常借助于程序设计语言的指针类型来描述。
5. 选择题(1)~(6):CCBDDA6.(1)O(1) (2)O(m*n) (3)O(n2)(4)O(log3n) (5)O(n2) (6)O(n)第2章1.选择题(1)~(5):BABAD (6)~(10):BCABD (11)~(15):CDDAC 2.算法设计题(1)将两个递增的有序链表合并为一个递增的有序链表。
要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。
表中不允许有重复的数据。
[题目分析]合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的最后。
如果两个表中的元素相等,只摘取La表中的元素,删除Lb表中的元素,这样确保合并后表中无重复的元素。
当一个表到达表尾结点,为空时,将非空表的剩余元素直接链接在Lc表的最后。
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){//合并链表La和Lb,合并后的新表使用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa && pb){ if(pa->data<pb->data){pc->next=pa; pc=pa; pa=pa->next;}//取较小者La中的元素,将pa链接在pc的后面,pa指针后移else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移else //相等时取La中的元素,删除Lb中的元素{pc->next=pa;pc=pa;pa=pa->next;q=pb->next; delete pb ; pb =q;}}pc->next=pa?pa:pb; //插入剩余段delete Lb; //释放Lb的头结点}(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。
上海交通大学数据结构与C语言程序设计习题及答案

专业课复习资料(最新版)封面数据结构与C语言程序设计一. 是非题(2’⨯10)( )1、 队列逻辑上是一个表头和表尾既能插入又能删除的线性表。
( )2、 任何一个递归过程都可以转换成非递归过程。
( )3、 与n个键值的集合{k1,k2,…,kn}相对应的堆是唯一的。
( )4、 在索引顺序表上实现分块查找,在等概率查找情况下,其查找长度只与表中元素个数有关,而与每块中元素个数无关。
( )5、 所谓加权无向图G的最小生成树T就是将G中各结点间的最短路径作为边所构造出来的G的子图。
( )6、 在10万个随机排列的数据中,要选出5个最小的数,采用快速排序比采用Shell排序、堆排序及各种直接排序法都快。
( )7、 B树查找算法的时间复杂性为O(n)。
( )8、 哈希表查找无需进行关键字的比较。
( )9、 在执行某个排序过程中,出现排序码朝着最终位置相反方向移动,则该算法是不稳定的。
( )10、任何有向图的顶点都可以按拓扑序排序。
二.填空题(2’⨯6)1.假设用于通信的电文由8个字母组成,其频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10, 为这8个字母设计哈夫曼编码,其中编码长度最大的字母的编码是 位。
2.已知二叉树按中序遍历所得到的结点序列为DCBGEAHFIJK, 按后序遍历所得到的结点序列为DCEGBFHKJIA, 按先序遍历所得到的结点序列为 。
3. 设哈希表长度为11,散列函数H(k)=k MOD 11, 若输入顺序为(18,10,21,9,6,3,16,25,7),处理冲突方法为线性探测再散列,请构造哈希表 。
果 。
5.已知模式匹配的KMP算法中模式串t=’adabbadada’,其next函数的值为 。
6.在置换-选择排序中,假设工作区的容量为w,若不计输入、输出的时间,则对n个记录的文件而言,生成所有初始归并段所需时间为 。
三.简答题(6’⨯5)1.有n个不同的英文单词,它们的长度相等,均为m,若n>>50,m<5,试问采用什么排序方法时间复杂度最佳?为什么?2.对于一个栈,给出输入序列A,B,C,试给出全部可能的输出序列。
数据结构线性表答案 (1)

第一章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
解:头指针是指向链表中第一个结点的指针。
首元结点是指链表中存储第一个数据元素的结点。
头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。
它可以对空表、非空表以及首元结点的操作进行统一处理。
2.2 填空题。
解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。
(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。
单链表中逻辑上相邻的元素的物理位置不一定紧邻。
(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。
(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。
2.3 在什么情况下用顺序表比链表好?解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。
2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。
解:2.5 画出执行下列各行语句后各指针及链表的示意图。
L=(LinkList)malloc(sizeof(LNode)); P=L; for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode)); P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2); for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
a. 在P结点后插入S结点的语句序列是__________________。
数据结构作业题及参考答案

东北农业大学网络教育学院数据结构作业题(一)、选择题(每题2分,共20 分)1在一个长度为n的顺序表的任一位置插入一个新元素的渐进时间复杂度为( )。
2A Qn) B、O(n/2) C、O(1) D O(n )2.带头结点的单链表first为空的判定条件是( )。
A、first == NULL ;B、first->link == NULL ;C、first->link == first ;D、first != NULL ;3•在一棵树中,( )没有前驱结点。
A、分支结点B、叶结点C、树根结点D、空结点4•在有向图中每个顶点的度等于该顶点的( )。
A、入度B、出度C、入度与出度之和D、入度与出度之差5.对于长度为9的有序顺序表,若采用折半搜索,在等概率情况下搜索成功的平均搜索长度为( ) 的值除以9。
A、20B、18C、25D、226•下列程序段的时间复杂度为( )。
s=0;for(i=1 ; i<n; i++)for(j=1 ; j<n ; j++)s+=i*j ;2A、O(1)B、O(n)C、O(2n)D、O(n)7•栈是一种操作受限的线性结构,其操作的主要特征是( )。
A、先进先出B、后进先出C、进优于出D、出优于进&假设以数组A[n]存放循环队列的元素,其头、尾指针分别为front和rear。
若设定尾指针指向队列中的队尾元素,头指针指向队列中队头元素的前一个位置,则当前存于队列中的元素个数为( )。
4•在二叉树的第i 层上至多有 ______________ 结点。
5.对于一棵具有 n 个结点的二叉树,若一个结点的编号为A、 C、 (rear-front-1) % n B 、(rear-front) % n (front-rear+1) % nD 、(rear-front+n) % n高度为5的完全二叉树中含有的结点数至少为(16B 、17C 、3110.如图所示有向图的一个拓扑序列是D 、32)A 、 ABCDEFB 、 FCBEADC 、 FEDCBAD 、 DAEBCF二、填空题(每空1分,共20 分)1. n (n > 0)个顶点的无向图最多有2.在一棵AVL 树中,每个结点的左子树高度与右子树高度之差的绝对值不超过 ________ 。
15.带头结点的单链表L,设计一个算法使元素递增有序

15.带头结点的单链表L,设计⼀个算法使元素递增有序#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;//尾插法LinkList List_TailInsert(LinkList &L){int x;L=(LinkList)malloc(sizeof(LNode));LNode *s,*r=L;printf("请输⼊单链表各个节点,以9999结束!\n");scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;scanf("%d",&x);}r->next=NULL;return L;}//带头结点的单链表L,设计⼀个算法使元素递增有序void Sort(LinkList &L){LNode *pre,*p=L->next,*r=p->next;p->next=NULL;//将p与后⾯的链表断开,直接插⼊排序p=r;while(p!=NULL){r=p->next;//找到p的后续节点防⽌断链pre=L;//每次断开的链表中找到合适的p之前的位置while(pre->next!=NULL&&pre->next->data<p->data)pre=pre->next;//执⾏结束就找得到了p之前的位置p->next=pre->next;//将p插⼊到前⾯的有序链表中pre->next=p;p=r;}}int main(){LinkList L;LinkList R;//接收处理结果R=List_TailInsert(L);Sort(R);LNode *p=R;while(p->next!=NULL){p=p->next;printf("->%d",p->data);}}。
大工15秋《数据结构》在线作业1满分答案

大工15秋《数据结构》在线作业1满分答案大工15秋《数据结构》在线作业1一单选题1.广义表((e))的表头是()。
A. eB. (e)C. ()D. (())正确答案:B2.在一个单链表中,若要在p所指向的结点之后插入一个新结点,则需要相继修改()个指针域的值。
A. 1B. 2C. 3D. 4正确答案:B3.在一个长度为n的线性表中,删除值为x的元素时需要比较元素和移动元素的总次数为()。
A. (n+1)/2B. n/2C. nD. n+1正确答案:C4.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是()。
A. head==NULLB. head→next==NULLC. head→next==headD. head!=NULL正确答案:B5.一个顺序栈S,元素a,b,c,d,e依次进栈,如果5个元素的出栈顺序为b,e,d,c,a,则顺序栈的容量至少应为()。
A. 2B. 3C. 4D. 5正确答案:C6.在表长为n的顺序表中,若在每个位置插入数据元素的概率相等,插入一个数据元素平均需要移动()个数据元素。
A. (n-1)/2B. n/2C. n-1D. n正确答案:B7.广义表L=(a,(b,c)),进行Tail(L)操作后的结果为()。
A. cB. b,cC.(b,c)D.((b,c))正确答案:D8.表达式a*(b+c)-d的后缀表达式是()。
A. abcd*+-B. abc+*d-C. abc*+d-D. -+*abcd精确谜底:B9.在一个单链表中,删除*p结点之后的一个结点的操作是()。
A. p->next=p;B. p->next->next=p->next;C. p->next->next=p;D. p->next=p->next->next;精确谜底:D10.最大容量为n的轮回行列,队尾指针是rear,队头是front,则队空的条件是()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
带头结点的单链表(一)【基本操作训练】——现有以下定义,你的函数可以直接使用,无需再提交。
#define True 11#define False 0#define Ok 111#define Error -111#define List_Init_Size 10#define ListIncrement 10typedef int Status;//状态类型typedef struct{int num;//专家号,不重复,可用于查找专家char name[30];//专家姓名,可能重复}ElemType; //元素类型-----专家信息数据类型---------特别关注“数据元素”-------------//typedef ElemType ET;typedef struct Lnode{ElemType data;struct Lnode *next;}LNode,*LinkList;在招投标系统中,专家信息的更新换代比较频繁,假定采用“单链表”结构存储专家信息,请完成以下“带头结点的单链表”的部分基本操作:(1)(10分)功能:构造一个带头结点的空单链表 L。
函数名:InitList_L参数:单链表头指针L返回值:成功返回Ok;否则,返回Error。
注意:考虑是否引用型参数、参数是怎样的数据类型、返回值类型应当如何? (2)(10分)功能:求单链表L的长度函数名:ListLength_L参数:单链表头指针L返回值:实际元素个数注意:考虑是否引用型参数、参数是怎样的数据类型、返回值类型应当如何? (3)(20分)功能:取表L中的第i个结点值赋值给参数e(注意i的取值范围)函数名:GetElem_L参数:单链表头指针L,位置i,数据元素e返回值:取值成功返回Ok;否则,返回Error。
注意:考虑是否引用型参数、参数是怎样的数据类型、返回值类型应当如何? (4)(20分)Status ListInsert_L(LinkList L , int i , ET e);功能:在表L的第i个位置上插入一个值为e的数据元素。
返回值:成功返回Ok;否则,返回Error。
(5)(20分)Status ListDelete_L(LinkList L , int i , ET &e);功能:在表L中删除位序为 i 的数据元素,并将删除的元素赋值给e。
返回值:成功返回Ok;否则,返回Error。
(6)(20分)Status PriorElem_L(LinkList L , ET e , ET &pre_e); 功能:在表L中求元素e的直接前驱元素,并赋值给pre_e。
返回值:成功返回Ok;否则,返回Error。
注意:针对当前的情形,用元素中num成员(比如:e.num)进行比较注意:(1)不用编写main函数,函数中没有任何输入输出语句;(2)所有函数必须同时提交,另外,需要用到特殊的库函数,请自行包含其头文件;否则编译出错;(3)在 VC 或 VS 环境中调试时,必须建立.CPP源文件。
【【【【【请自主设计“测试程序”,证明你的每一个函数实现了相应功能(以下两个函数有助于测试,不提交)。
】】】】】void printLinkList1(LinkList L){int len=0;LinkList p=L;printf("\n单链表的元素为:");while(p->next){len++;p=p->next;printf("%d ",p->data.num);}printf("\n单链表长度len=%d\n",len);}void CreateList_L1 (LinkList &L, int n)//建立一个带头结点的长度为n的单链表L{int i;LinkList p,tail;L=( LinkList ) malloc ( sizeof ( Lnode ) ); //L指向头结点tail=L;printf("\n请输入%d个元素:",n);for(i=n;i>0; --i){p=( LinkList ) malloc ( sizeof ( Lnode ) ); //p为新结点scanf("%d",&(p->data.num)); //为结点p的数据域赋值tail->next=p;tail=p;//将结点p插入到表尾}tail-> next = NULL;}预设代码1.#include<stdio.h>2.#include<stdlib.h>3.#define True 14.#define False 05.#define Ok 116.#define Error -117.typedef int Status;//状态类型8.typedef struct{9. int num;//专家号10. char name[30];//专家姓名11.}ElemType; //元素类型-----专家信息数据类型12.typedef ElemType ET;13.typedef struct Lnode{14. ElemType data;15. struct Lnode *next;16.}LNode,*LinkList;17.Status InitList_L( LinkList &L);//构造一个空的线性表L18.int ListLength_L(LinkList L);19.Status GetElem_L(LinkList L, int i, ElemType &e);20.Status ListInsert_L(LinkList L , int i , ETe);21.Status ListDelete_L(LinkList L , int I , ET &e);22.int LocateElem_L(LinkList L,ET e);23.Status PriorElem_L(LinkList L , ET e , ET &pre_e);24.Status NextElem_L(LinkList L , ET e, ET &next_e);25.Status InitList_L1( LinkList &L){//构造一个空的线性表L26. L=(LinkList)malloc(sizeof(ET));27. if(L==NULL)28. return Error;29. L->next=NULL;30. return Ok;31.}32.Status GetElem_L1(LinkList L, int i, ElemType &e)33.{34. return Ok;35.}36.Status ListInsert_L1(LinkList L , int i , ETe){37. LinkList p=L,s;38. int j=0;39. while ( p && j< i -1 ){p=p->next;j++;} //寻找40. if (p==NULL || i<1) return Error;41. s = ( LinkList ) malloc ( sizeof (Lnode ) );42. if (s == NULL) return Error;43. s->data=e;44. s->next=p->next ; // 在p结点之后插入结点s45. p->next = s ; /* L->data++;链表长度计数*/46. return Ok;47.}48.int ListLength_L1(LinkList L)49.{50. LinkList p=L;51. int j=0;52. while(p->next)53. {54. ++j;55. p=p->next;56. }57. return(j);58.}59.Status ListDelete_L1(LinkList L , int i , ET&e){60. if(i<1) return Error;61. return Ok;62.}63.int LocateElem_L1(LinkList L , ET e)64.{65. return 0;66.}67.Status PriorElem_L1(LinkList L , ET e , E T &pre_e)68.{69. return Ok;70.}71.Status NextElem_L1(LinkList L , ET e , ET&next_e)72.{73. return Ok;74.}75.void printLinkL(LinkList L)76.{77. LinkList p=L;78. while(p->next ){79. p=p->next;80. printf("%d ",p->data.num);81. }82.}83.void printLinkList1(LinkList L)84.{85. int len=0;86. LinkList p=L;87. printf("\n单链表的元素为:");88. while(p->next){89. len++;90. p=p->next;91. printf("%d ",p->data.num);92. }93. printf("\n单链表长度len=%d\n",len);94.}95.void CreateList_L1 (LinkList &L, int n)96.//建立一个带头结点的长度为n的单链表L97. {98. int i;99. LinkList p,tail;100. L=( LinkList ) malloc ( sizeof ( Lno de ) ); //L指向头结点101. tail=L;102.// printf("\n请输入%d个元素:",n);103. for(i=n;i>0; --i)104. {105. p=( LinkList ) malloc ( sizeof ( Lnode ) ); //p为新结点106. scanf("%d",&(p->data.num));//为结点p的数据域赋值107. tail->next=p;tail=p;//将结点p插入到表头108. }109. tail-> next = NULL;110.}111.int flag;112.int main(){113. LinkList La,Lb;114. int select;115. int i=0;116. ET e;117. InitList_L1(La);118. scanf("%d",&i);119. CreateList_L1 (La,i);120.// printLinkList1(La);////////////////////////// 121. scanf("%d",&select);122. switch(select){123. case 1:{124. Lb =(LinkList)-1000;125. i=InitList_L(Lb);126. Lb->data.num =200;127. if(Lb->next==NULL && i==Ok){ 128. printf("OK!");129. }130. return 0;131. }132. case 2:133. /////////////////////134. i=ListLength_L(La);135. if(i==ListLength_L1(La))136. printf("%d OK!",i);137. return 0;138. case 3:{int k;139. scanf("%d",&k);e.num=9999;140. i=GetElem_L(La,k,e);141. if(i==Ok)142. printf("%d",e.num);143. else if(i==Error)144. printf("Error");145. return 0;146. }147. case 4:{int k;ET e={55};148. scanf("%d",&k);149. i=ListInsert_L(La,k,e);150. if(i==Ok )151. printLinkL(La);152. else if(i==Error)153. printf("Error");154. return 0;155. }156. case 5:{int k;ET e;157. scanf("%d",&k);158. i=ListDelete_L(La,k,e);159. if(i==Ok)160. printLinkL(La);161. else if(i==Error)162. printf("Error");163. return 0;164. }165. case 6:{ET e,pre_e;166. scanf("%d",&e.num);167. i=PriorElem_L(La,e,pre_e);168. if(i==Ok)169. printf("%d",pre_e.num);170. else if(i==Error)171. printf("Error");172. return 0;173. }174. }175. return 0;176.}参考答案1. Status InitList_L(LinkList&L)2.{3. L = (LinkList)malloc(sizeof(LNode));4. if(L == NULL)return Error;5. L->data.num = 0;6. L->next = NULL;7. return Ok;8.}9.Status ListLength_L(LinkList L)10.{11. LinkList p = L;12. int j = 0;13. while(p->next)14. {15. ++j;16. p = p->next;17. }18. return j;19.}20.Status GetElem_L(LinkList L,inti,ET &e)21.{22. LinkList p = L->next;23. int j = 1;24. while(p && j < i)25. {26. p = p->next;27. ++j;28. }29. if(!p || j > i)returnError;30. e = p->data;31. return Ok;32.}33.Status ListInsert_L(LinkList L,inti,ET e)34.{35. LinkList s,p = L;36. int j = 0;37. while(p && j < i-1)38. {39. p = p->next;40. ++j;41. }42. if(!p || j > i-1)return Error;43. s = (LinkList)malloc(sizeof(LNode));44. s->data = e;45. s->next = p->next;46. p->next = s;47. return Ok;48.}49.Status ListDelete_L(LinkList L,int i, ET &e )50.{51. LinkList p = L;52. int j = 0;53. while(p->next && j < i -1)54. {55. ++j;56. p = p->next;57. }58. if(!p->next || j > i-1 )return Error;59. LinkList q = p->next;60. p->next = q->next;61. e = q->data;62. free(q);63. return Ok;64.}65.Status PriorElem_L(LinkList L,ETe,ET &pre_e)66.{67. LinkList q = L;68. LinkList p = q->next;69. while(p && p->data.num !=e.num)70. {71. q = p;72. p = q->next;73. }74. if(!p)return Error;75. pre_e = q->data;76. return Ok;77.}78.。