实验二:单链表基本运算实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的
1.学会定义线性表的链式存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
2.掌握单链表的基本操作,实现单链表的插入、删除、查找等基本运算。
3.掌握对多函数程序的输入、编辑、调试和运行过程。
二、实验内容
1.预习C语言中结构体、指针的定义与基本操作方法。
2.对单单链表的每个基本操作用单独的函数实现。
3.编写一个完整的程序实现顺序表的下列基本操作:
(1) 分别用尾插法和头插法新建一个链表。
(2) 打印输出单链表中的元素。
(3) 在单链表中按位查找某个元素。
(4) 在单链表中按值查找某个元素。
(5) 在单链表中指定位置插入元素。
(6) 在单链表中删除指定位置的元素。
编写一个主菜单,调用以上基本操作。

参考程序代码如下,请将其补充完整,并上机调试运行。


//链表的建立、查找、插入与删除,表元素为数字
#include
#include
#include

#define Null 0

//链表结点结构定义
typedef struct node
{
int data; //存放表结点值
struct node *next; //存放表结点的直接后驱元素的地址
} ListNode,*LinkList;


//头插法创建初始链表

LinkList create_h(int size)
{
LinkList head,p;
int i;

;//申请头结点存储空间
;//头结点next域置空
printf("请输入这%d个元素的值:\n",size);
for(i=0;i{
p=(LinkList)malloc(sizeof(ListNode));//申请新结点的存储空间
scanf("%d",&p->data);//读入新结点的值到data域中
;//将新增结点插到头结点的后面
;//将新增结点插到头结点的后面
}
return head;
}

//尾插法创建初始链表

LinkList create_t(int size)
{
LinkList head,p,r;
int i;

;//申请头结点存储空间
;//头结点next域置空
;//尾指针q指向头结点


printf("请输入这%d个元素的值:\n",size);
for(i=0;i{
p=(LinkList)malloc(sizeof(ListNode));
scanf("%d",&p->data);
;//将新增结点插到表尾
;//将新增结点插到表尾
;//将尾指针指向新增结点
}
return head;
}



//求链表的长度
int length(LinkList head)
{
LinkList p;
int i;

;//将工作指针p指向第1个结点
;//计数器置0

while(p!=Null)
{
;//将工作指针p指向后一个结点
;//计数器累加
}
return i;
}

//打印链表中的现有元


printList(LinkList head)
{
LinkList p;
;//将工作指针p指向第1个结点

printf("该表中现有%d个元素,它们分别是:\n", );
while(p!=Null)
{
;//打印工作指针p指向结点的值
;//将工作指针p指向后一个结点
}
printf("\n");
}


//按位查找元素
get(LinkList head ,int i)
{
LinkList p;
int j;

p=head->next;
j=1;

while( )//定位第i个结点
{
p=p->next;
j++;
}
if( ) printf("找到了第%d个元素,其值为:%d\n", );
else printf("位置不合法!无法找到该元素!\n");

}

//按值查找元素
locate(LinkList head,int x)
{
LinkList p;
int j;

p=head->next;
j=1;
while( )
{
p=p->next;
j++;
}
if ( )
printf("找到该元素%d,它是该表中第%d个元素!\n", );
else
printf("找不到该元素%d!\n",x);

}


//在链表中插入元素
insert(LinkList head,int i,int x)
{
LinkList p,s;
int j;

;//将工作指针p指向头结点
;//计数器置0

while( )//定位到第i个结点的直接前驱结点上
{
p=p->next;
j++;
}
if ( )
{
;//申请新结点的存储空间
;//将新结点的data域赋值
;//修改新结点的next域
;//将新结点插入

printf("插入成功!\n");
}
else
printf("插入位置非法!\n");
}

//在链表中删除元素
deleteLink(LinkList head,int i)
{
LinkList p,q;
int j;


;//将工作指针p指向头结点
;//计数器置0

while( )//定位到第i个结点的直接前驱结点上
{
p=p->next;
j++;
}
if( )
{
;//q指向将被删除的结点
;//删除结点
printf("删除成功!删除了表中第%d个元素,其值为%d!\n", );
;//释放被删除元素的存储空间
}
else
printf("空表或删除位置不合法!\n");
}

void main()
{
int num,i,x;
int operate;
LinkList h;
printf("*这是链表的运算实现实验!*\n");

for(;;)
{
//选择单链表操作动作
printf("请输入操作对应的数字进行顺序表的操作:\n");
printf("————头插法建立链表(1)\n");
printf("————尾插法建立链表(2)\n");
printf("————按位查找元素(3)\n");
printf("————按值查找元素(4)\n

");
printf("————插入元素(5)\n");
printf("————删除元素(6)\n");
printf("————退出(0)\n");
scanf("%d",&operate);

switch(operate)
{

case 1:
printf("请输入初始链表的元素个数:\n");
scanf("%d",&num);
h=create_h(num);
printf("这是头插法建立的链表:\n");
printList(h);
break;
case 2:
printf("请输入初始链表的元素个数:\n");
scanf("%d",&num);
h=create_t(num);
printf("这是尾插法建立的链表:\n");
printList(h);
break;
case 3:
printf("按位查找元素,请输入要查询的元素的位置:\n");
scanf("%d",&i);
get(h,i);
printList(h);
break;
case 4:
printf("按值查找元素,请输入要查询元素的值:\n");
scanf("%d",&x);
locate(h,x);
printList(h);
break;
case 5:
printf("插入元素,请输入要插入元素的值:\n");
scanf("%d",&x);
printf("插入元素,请输入要插入的位置:\n");
scanf("%d",&i);
insert(h,i,x);
printList(h);
break;
case 6:
printf("删除元素,请输入要删除的位置:\n");
scanf("%d",&i);
deleteLink(h,i);
printList(h);
break;
case 0:
exit(0);
}
}
}
三、实验环境
硬件环境:
软件环境:

四、调试过程
设计输入数据:
记录输出结果:
记录程序调试过程中遇到的问题和解决办法:

五、结论
实验中产生错误的原因分析:

相关文档
最新文档