1、实验 2 链表基本操作实验 一、实验目的1 定义单链表的结点类型。2 熟悉对单链表的一些基本操作和具体的函数定义。3 通过单链表的定义掌握线性表的链式存储结构的特点。二、实验内容与要求该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。要求:同学们可参考指导书实验 2 程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。三、 算法分析与设计。1.创建单链表:LinkedLis
2、t LinkedListCreat( ) 创建链表函数LinkedList L=LinkedListInit(),p, r; 调用初始化链表函数r=L; r 指向头结点使用 malloc 函数动态分配存储空间,指针 p 指向新开辟的结点,并将元素存放到新开辟结点的数据域,p=(LinkedList)malloc(sizeof(LNode);p-data=x;r-next=p; 将新的结点链接到头结点 r 之后r=p; r 指向 p 结点scanf(“%d“, 满足条件循环输入链表元素while(x!=flag) 当输入不为-1 时循环r-next=NULL; return L; 将链表结尾赋空
3、值,返回头结点 L头结点 LLAnA1 A22.单链表插入pss-data=x; s-next=p-next; p-next=s;3.单链表的删除:pp-next=p-next-next;void LinkedListInsert(LinkedList L,int i,ElemType x) 链表插入函数(L 头指针,i 插入位置,x 插入元素)LinkedList p,s;定义结构体类型指针 p,sj=1;p=L; 定义整型 j 计数,寻找插入位置,p 指针指向头结点p=p-next;j+; 满足条件时 p 指针后移,j 自加 1while(p# define TRUE 1# define
4、FALSE 0# define NULL 0# define flag -1/*单链表的结点类型*/typedef struct LNodeElemType data;struct LNode *next;LNode,*LinkedList;/*初始化单链表*/LinkedList LinkedListInit()LinkedList L;L=(LinkedList)malloc(sizeof(LNode);L-next=NULL;return L;/*清空单链表*/void LinkedListClear(LinkedList L)L-next=NULL;printf(“链表已经清空n“);
5、/*检查单链表是否为空*/int LinkedListEmpty(LinkedList L)if(L-next=NULL) return TRUE;else return FALSE;/*遍历单链表*/void LinkedListTraverse(LinkedList L)LinkedList p;p=L-next;if(p=NULL) printf(“单链表为空表n“);else printf(“链表中的元素为:n“);while(p!=NULL)printf(“%d “,p-data); p=p-next;printf(“n“);int LinkedListLength (LinkedL
6、ist L)LinkedList p;int j;p=L-next;j=0;while(p!=NULL)j+;p=p-next;return j;LinkedList LinkedListGet(LinkedList L,int i)LinkedList p;int j;p=L-next;j=1;while(p!=NULLj+;if(j=i) return p;else return NULL;int LinkedListLocate(LinkedList L,ElemType x)LinkedList p;int j;p=L-next;j=1;while(p!=NULLj+;if(p) re
7、turn j;else return 0;void LinkedListInsert(LinkedList L,int i,ElemType x)LinkedList p,s;int j;j=1;p=L;while(pj+;if(p=NULL|ji)printf(“插入位置不正确n“);elses=(LNode *)malloc(sizeof(LNode);s-data=x;s-next=p-next;p-next=s;printf(“%d 已插入到链表中n“,x);void LinkedListDel(LinkedList L,int i)LinkedList p,q;int j;j=1;p
8、=L;while(p-nextj+;if(p-next=NULL)printf(“删除位置不正确n“);elseq=p-next;p-next=q-next;free(q);printf(“第%d 个元素已从链表中删除n“,i);LinkedList LinkedListCreat()LinkedList L=LinkedListInit(),p,r;ElemType x;r=L;printf(“请依次输入链表中的元素,输入-1 结束n“);scanf(“%d“,while(x!=flag)p=(LinkedList)malloc(sizeof(LNode);p-data=x;r-next=p
9、;r=p;scanf(“%d“,r-next=NULL;return L;int scan()int d;printf(“请选择要进行的操作n“);printf(“-n“);printf(“1.初始化 2.清空 3.求链表长度 4.检查链表是否为空n“);printf(“-n“);printf(“5.遍历链表 6.从链表中查找元素n“);printf(“-n“);printf(“7.从链表中查找与给定元素值相同的元素在顺序表中的位置n“);printf(“-n“);printf(“8.向链表中插入元素 9.从链表中删除元素 10 创建线性表n“);printf(“-n“);printf(“其他
10、键退出。 。 。n“);printf(“输入: “);scanf(“%d“,return(d);main()int quit=0;int i,locate; ElemType e;LinkedList L,p;while(!quit)switch(scan()case 1:L=LinkedListInit();printf(“n“);break;case 2:LinkedListClear(L);printf(“n“);break;case 3:printf(“链表长度为 %dn“,LinkedListLength(L);break;case 4:if(LinkedListEmpty(L)pr
11、intf(“链表为空n“);else printf(“链表非空n“);break;case 5:LinkedListTraverse(L);break;case 6:printf(“请输入待查询元素在链表中的位置:“);scanf(“%d“,p=LinkedListGet(L,i);if(p) printf(“链表第%d 个元素的值为:%dn“,i,p-data);else printf(“查询位置不正确n“); break;case 7:printf(“请输入待查询元素的值:“);scanf(“%d“,locate=LinkedListLocate(L,e);if(locate)printf
12、(“%d在链表中的位置是:%dn“,e,locate);else printf(“链表中没有值为%d 的元素n“,e);break;case 8:printf(“请输入插入元素的位置和值(中间以空格或回车分隔):n“);scanf(“%d%d“,LinkedListInsert(L,i,e);break;case 9:if(LinkedListLength(L)=0)printf(“链表已经为空,不能删除!n“);elseprintf(“请输入待删除元素的位置: “);scanf(“%d“,LinkedListDel(L,i);break;case 10:L=LinkedListCreat();printf(“n“);break;default:quit=1;