《数据结构》实验报告实验序号:3 实验项目名称:链式表的操作int n,i,a;//n为节点数,i为插入元素的位置,a为插入元素的值LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("请输入要插入的位置:");scanf("%d",&i);printf("请输入要插入的值:");scanf("%d",&a);ListInsert_L(L,i,a); //在第i个位置插入元素aShowList_L(L); //输出链表L中的所有元素}运行以上程序,根据要求完成下列题目:1.参考P30页中的例题2.10实现ListDelete_L函数,并在主函数中测试;2.编写一个函数计算值为3的结点个数,并在主函数中测试;以下题目任选一题:3.编写一个删除链表中值为3的结点的直接前趋结点的算法,若有多个值为3的结点,则删除第一个值为3的直接前趋结点;4.改写CreateList_L函数,使得链表创建时为非降序排列;5.改写ListInsert_L函数,忽略位置参数,在上述非降序排列链表中插入一个元素,使得链表依然保持非降序;6.写一个对单循环链表进行逆序遍历(打印每个结点的值)的算法;7.编写一个函数,将单链表中值重复的结点删除,使所得的结果表中各结点值双联表牛13,双链表牛13,牛13第一张图第一个数据是59,截图接没了;8. 改写CreateList_L函数,采用尾插法创建带有头节点的单链表。
四、实验结果与数据处理详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果(贴图)。
五、分析与讨论对上机实践结果进行分析,上机的心得体会。
六、教师评语成绩附源程序清单:1只写改的和后添加的代码Status ListDelete_L(LinkList &L, int i,ElemType &e){LinkList p,q;int j;p=L;j=0;while((p->next)&&(j<i-1)){p=p->next;++j;}if(!(p=p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}void main(){int n,i,a;//n为节点数,i为插入元素的位置,a删除相应元素后的显示质LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("请输入要删除的位置:");scanf("%d",&i);ListDelete_L(L,--i,a); //在第i个位置删除元素ShowList_L(L); //输出链表L中的所有元素}2# include <stdlib.h># include <stdio.h># define ERROR 1# define OK 0# define OVERFLOW 1typedef int ElemType;//给int一个别名ElemTypetypedef int Status;//给int一个别名Statustypedef struct LNode{ElemType data;struct LNode *next;} LNode, *LinkList;void CreateList_L ( LinkList &L, int n ){// 输入n 个数据元素的值,建立带头结点的单链表Lprintf("请输入插入链表的节点值:\n");LinkList p;int i;L = ( LinkList ) malloc ( sizeof ( LNode ) );L->next = NULL; // 先建立一个带头结点的空链表for ( i = n; i > 0; i-- ){p = ( LinkList ) malloc ( sizeof ( LNode ) );scanf ("%d" ,&p->data );p->next = L->next;L->next = p;}}Status ListInsert_L ( LinkList &L, int i, ElemType e ){// 带头结点的单链表L中第i 个位置之前插入元素eLinkList p,s;int j; //j为计数器p = L; //p指向L的头节点j = 0;while ( p && j<i-1 ) //顺指针向后查,直到p指向第i个元素之前{p = p->next; ++j;}if ( ! p || j >i-1 )return ERROR;s = ( LinkList ) malloc ( sizeof ( LNode ) ); // 生成新结点s->data = e; // 使新结点数据域的值为es->next = p->next; // 将新结点插入到单链表L 中p->next = s; // 修改第i-1 个结点指针return OK;}void ShowList_L ( LinkList L ){// 输出链表L中的所有元素LinkList p;printf("链表中的元素为:\n");p=L->next; //跳过头结点while(p){printf(" %d ",p->data);p=p->next;}}int function(LinkList &L,int i){LinkList p,q;p=L;int j=0;while(p){if(p->data==i)j++;p=p->next;}return j;}void main(){int n,i,a;//n为节点数,i为插入元素的位置,a为查找后总计数LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);CreateList_L ( L, n ); //初始化链表节点个数为nprintf("输入要查找的元素\n");scanf("%d",&i);a=function(L,i);printf("%d\n",a);}7#include<stdio.h>#include<stdlib.h>#define ERROR 0#define OK 1#define VERFLOW 1int a[100]={0};typedef int ElemType;typedef int Status;typedef struct LNode{ElemType data;struct LNode *pre,*next;}LNode,*LinkList;void createlist(LinkList &L,int n){printf("输入插入链表的值\n");LinkList p,q;int i;L=(LinkList)malloc(sizeof(LNode));q=L;L->next=NULL;L->pre=NULL;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);q->next=p;p->pre=q;q=p;}q->next=NULL;}Status ListDelete_L(LinkList &L, int c,int n)//删除相同的值的位置,c是要删除的数字{LinkList p;int j,k;p=L->next;for(j=0;j<n;j++){k=p->data;if(k==c)break;p=p->next;}p->pre->next=p->next;p->next->pre=p->pre;free(p);return OK;}void find(LinkList &L,int n)//发现链表中重复数字的函数用全局变量数组a记录出现次数,a 【i】中i为记录重复数字{LinkList p;p=L->next;int i,v,j;for(i=0;i<n;i++){v=p->data;for(j=0;j<100;j++){if(v==j){a[j]=a[j]+1;}}p=p->next;}}void chazhao(LinkList &L,int x,int n,int b)//b是链表中多余的数字,n是链表长度,x是出现此数,chazhao是进行删除操作的主函数{int j;LinkList p;p=L->next;for(j=0;j<(x-1);j++){ListDelete_L(L, b, n);//b是需要杀出的节点}}void start(LinkList &L,int n){//进行查找删除的主函数int i,x,b;for(i=0;i<100;i++){if(a[i]>=2){x=a[i];b=i;chazhao(L,x,n,b);}}}void ShowList_L ( LinkList L ){// 输出链表L中的所有元素LinkList p;printf("链表中的元素为:\n");p=L->next; //跳过头结点while(p){printf(" %d ",p->data);p=p->next;}}void main(){int n;LinkList L;printf("请输入链式表的节点数:");scanf("%d",&n);createlist ( L, n );find (L,n);start(L,n);ShowList_L ( L );}8void CreateList_L ( LinkList &L, int n ){// 输入n 个数据元素的值,建立带头结点的单链表L printf("请输入插入链表的节点值:\n");LinkList p,r;int i;L = ( LinkList ) malloc ( sizeof ( LNode ) );r=L;for ( i = 0; i < n ; i++ ){p = ( LinkList ) malloc ( sizeof ( LNode ) ); //尾插法:新生成节点p储存链表的元素,然后让他的前一个节点(当前链表的尾节点)指向他;头插法:新生成借点储存当前链表元素,然后让当前链表的头结点指向新生成节点scanf ("%d" ,&p->data ); // p->next=l->next;新生成节点指向链表的下一个节点r->next=p; // l->next=p;r=p;}r->next=NULL;}。