链表的操作实验

这篇博客介绍了如何使用C语言实现链表数据结构,包括尾插法创建单链表、查找元素位置、插入元素以及统计相同元素个数的功能。实验详细阐述了每个操作的步骤和代码实现,旨在帮助读者掌握线性表的链式存储操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、实验名称和性质

二、实验目的

三、实验内容

四、知识准备

五、实验要求

六、代码


一、实验名称和性质

所属课程

数据结构

实验名称

链表的操作

实验学时

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;	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值