目录
一、实验名称和性质
所属课程 | 数据结构 |
实验名称 | 链表的操作 |
实验学时 | 2 |
实验性质 | □验证 □综合 √设计 |
必做/选做 | √必做 □选做 |
二、实验目的
1.掌握线性表的链式存储结构——单链表的定义及C语言实现。
2.掌握线性表在链式存储结构——单链表中的各种基本操作。
三、实验内容
1.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。
2.设计一个函数在链表中查找元素x的位置,如果x不在链表中则返回0。
3.设计一个函数将元素x插入第i个元素的后面。如果i大于链表的长度,则将x插入链表的末尾;如果i小于或等于0,则将x直接插入表头之后。
4.计算已知一个单链表中数据域值为一个指定值x的结点个数。
四、知识准备
前期要求熟练掌握了C语言的编程规则、方法,单链表和双向链表的基本操作算法。
五、实验要求
编程实现如下功能:
(1)根据输入的一系列整数,以0标志结束,用尾插法建立单链表,并输出单链表中各元素值,观察输入的内容与输出的内容是否一致。
(2)在单链表中查找元素x的位置,如果存在,则返回该元素的序号,否则返回0。
(3)在单链表的第i个元素之后插入一个值为x的元素,如果i大于链表的长度,则将x插入链表的末尾;如果i小于或等于0,则将x直接插入表头之后。并输出插入后的单链表中各元素值。
(4)输入x,统计单链表中值和x相同的结点的个数,并返回个数,如果没有,返回0。
六、代码
#include <bits/stdc++.h>
using namespace std;
#define OK 1 //成功标识
#define ERROR 0 //失败标识
typedef int status; //Status是函数的类型,其值是函数结果状态代码,如OK等
typedef struct node{
int data; //数据域
struct node *next;//指针域
}Lnode,*List;
void creat(List &L,int n)//尾插法
{
L=new node;
L->next=NULL;//创建只有一个空节点的新链表
List t=new node;
t=L;
cout<<"请输入n个元素:";
for(int i=0;i<n;i++)
{
List p=new node;//生成一个新节点
cin>>p->data ;//给新节点赋值
p->next =NULL ;
t->next =p;//将此节点插在尾节点之后
t=p;//位移,使t一直是最后一个节点
}
}
status find(List L,int e)
{
List p=new node;
int j=0;
p=L;//移动节点p查找数据域为e的节点
while(p&&p->data !=e)//查找
{
p=p->next ;
j++;
}
if(!p&&p->data !=e)
return ERROR;
return j;
}
status Insert(List &L,int i,int e)
{
List p=new node;//设置p为移动节点,协助查找第i个元素
List t=new node;//开辟新结点便于插入
p=L;
int j=0;//(为什么上面查找的时候j=1,这里却等于0呢)好好思考一下偶!!
if(i<=0)//插到头节点之后
{
t->data =e;//给新结点赋值
t->next =p->next ;//指向第i个节点
p->next=t;//代替第i个节点的位置
return OK;
}
while(p&&j<i)//找到第i-1个节点
{
p=p->next ;
j++;
}
if(!p||j>i)//错误是返回插入失败
return ERROR;
t->data =e;//给新结点赋值
t->next =p->next ;//指向第i个节点
p->next=t;//代替第i个节点的位置
return OK;
}
status find1(List L,int e)//查找指定元素个数
{
List p=new node;
int j=0;
p=L;//移动节点p查找数据域为e的节点
while(p)//查找
{
if(p->data ==e)
j++;
p=p->next ;
}
return j;
}
void Put(List L)
{
cout<<"表中当前元素:";
List p=new node;
p=L->next ;
while(p)
{
cout<<p->data<<' ' ;
p=p->next ;
}
cout<<endl;
}
int main()
{
int n;
List L=new node;
cout<<"请输入元素创建链表:";
cin>>n;
creat(L,n);
Put(L);
cout<<"输入要查找的元素:";
int x,i;
cin>>x;
i=find(L,x);
cout<<"该元素位置:"<<i<<endl;
cout<<"输入要插入的元素:";
cin>>x;
cout<<"输入要插入的元素位置:";
cin>>i;
Insert(L,i,x);
cout<<"输入要查找的元素:";
cin>>x;
i=find1(L,x);
cout<<"值为x的元素个数:"<<i;
return 0;
}