单链表基本操作C++

我的注释写的花里胡哨的是为了我自己理解的,这是我的数据结构实验报告

#include<iostream>
using namespace std;
#define ERROR -1
#define OK 1

typedef int ElemType;
typedef int Status;
// 结点定义
typedef struct LNode {//链表有两个数据域一个存指针一个存数据
	ElemType data; // 数据域
	struct LNode *next; // 指针域 struct LNode这种类型的指针
} Lnode, *LinkList;//新的数据类型Lnode 
//1.用尾插法构造单链表,新结点插入在单链表尾结点之后
//用户依次输入 n 个数据元素
void CreateListTail(LinkList &L, int n)
{ 
	L = (LinkList)malloc(sizeof(LNode));//动态分布一个结点
	L->next = NULL;//先建立一个带头节点的单链表
	Lnode *p,*q;//定义一个指向该类型的指针 q指向终端结点
	q = L;
	for (int i = 0; i < n; i++)
	{
		p = (LinkList)malloc(sizeof(LNode));
		cin >> p->data;//输入数据
		q->next = p;
		q = q->next;//q指向终端结点

	}
	q->next = NULL;//终端结点最后一个指向空
}
//2.用头插法构造单链表,新结点插入在单链表头结点之后
//用户依次输入 n 个数据元素
void CreateListHead(LinkList &L, int n)
{ 
	L = (LinkList)malloc(sizeof(LNode));//动态分布一个结点
	L->next = NULL;
	Lnode *p;
	for (int i = 0; i < n; i++)
	{
		p= (LinkList)malloc(sizeof(LNode));
		cin >> p->data;
		p->next = L->next;//因为 L->next就是头结点指向下一个,现在让p->next代替L->next的位置,二者是等价关系
		L ->next= p;//头节点改变位置,使p成为新的头结点(还是没懂)

	}



}
//3.返回单链表中第 i 个结点的值
Status GetElem(LinkList &L, int i, ElemType &e)
{ 
	Lnode *p;
	int j = 0;
	p = L->next;
	while (p&&j<i) {
		e = p->data;
		p = p->next;
		j++;
	
	}
	return e;
}
//4.在单链表 i 位置之后插入元素 e 
Status ListInsert(LinkList &L, int i, ElemType e)
{
	Lnode *s;//指向i的指针
	int j = 0;
	s = L->next;
	while (s&&j <i-1)
	{
		s = s->next;
		++j;
	}
	Lnode *p;//定义一个指针
	p = (LinkList)malloc(sizeof(LNode));//生成一个数据域用来插入
	p->data = e;
	p->next = s->next;
	s->next = p;
	return e;
}
//5.删除单链表中位于 i 位置的结点,成功输出"已删除第 i 个元素",
//失败则输出原因(栈为空,或者未找到第 i 个元素 )
Status ListDelete(LinkList &L, int i, ElemType &e)
{
	Lnode *q,*p;
	q = L; int j = 0;
	while (q->next&&j < i - 1)
	{
		q = q->next;
		j++;
	}
	if (!(q->next) || j > i - 1)
	{
		cout << "未找到第 i 个元素 ";
		return ERROR;
	}
	else
	{
		p = q->next;//q就是当前结点的前趋地址,p是当前要删除的结点的地址
		e = p->data;
		q->next = p->next;
		free(p);//释放点删除的结点
		cout << "已删除第"<<i<<" 个元素";
	}
	return e;
}
//6.清空单链表
void ClearList(LinkList &L)
{ 
	Lnode *p;
	while (L->next)//当不为空指针的时候
	{
		p = L->next;
		 L->next=p->next;//p的下一个结点
		delete p;


	}



}
//7.遍历单链表 ,输出各个结点的值
void Traverse(LinkList &L)
{
	Lnode *p;
	p = L->next;
	while (p) 
	{
		
		cout << p->data<<" ";
		p = p->next;
	}

}
//8.销毁单链表
void DestroyList(LinkList &L)
{
	Lnode *p;
	while (L) {//L是不是还存在
	
		p= L;
		L = L->next;//移动指针
		delete p;

	}

}
//9.删除单链表中值为 e 的结点,成功输出"已删除 e 元素",
//失败则输出原因(栈为空,或者未找到 e 元素
int DeleteElem(LinkList &L, ElemType e)
{ 
	Lnode *p,*temp;
	p = L->next;
	while (p)
	{
		temp = p;
		p = p->next;
		
		if (p->data == e)
		{
			temp->next = p->next;
			free(p);
			cout << "已删除 e 元素" << endl;
			return OK;
		}
		
		
	}
	cout << "栈为空,或者未找到 e 元素" << endl;


}
int main(void)
{
	LinkList L;
	ElemType e;
	int c = 0;
	while (c != 9) {
		cout << endl << "1. 头插法创建单链表";
		cout << endl << "2. 尾插法创建单链表";
		cout << endl << "3. 在单链表中查找第 i 个元素";
		cout << endl << "4. 在单链表中第 i 个位置插入元素";
		cout << endl << "5. 在单链表中删除第 i 个元素";
		cout << endl << "6. 在单链表中删除 e 元素";
		cout << endl << "7. 遍历单链表";
		cout << endl << "8. 销毁单链表";
		cout << endl << "9. 退出";
		cout << endl << "选择功能(1~9):";
		cin >> c;
		switch (c)
		{
		case 1: {
			cout << "请输入数据个数";
			int n;
			cin >> n;
			CreateListHead(L, n);
			Traverse(L);
			break; }
		case 2: {
			cout << "请输入数据个数";
			int n;
			cin >> n;
			CreateListTail(L, n);
			Traverse(L);
			break; }
		case 3: {
			cout << "请输入要查找第几个元素";
			int i;
			cin >> i;
			
			e=GetElem(L, i, e);
			cout << e << endl;
			Traverse(L);
			break; }
		case 4: {
			cout << "请输入要插入的位置和插入的元素";
			int i;
			cin >> i>>e;
			ListInsert(L, i, e);
			Traverse(L);
			break; }
		case 5: {
			cout << "请输入要删除第几位的数";
			int i;
			cin >> i;
			ListDelete(L, i, e);
			Traverse(L);
			
			break; }
		case 6: {
			cout << "请输入要删除的元素";
			cin >> e;
			DeleteElem(L, e);
			Traverse(L);
			break; }
		case 7: {
			Traverse(L);
			break; }
		case 8: {
			DestroyList(L);
			break; }
		case 9:break;
		}
	}
}

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表基本操作主要包括初始化、在头部插入元素、在指定位置插入元素和删除指定位置的元素。 首先,我们需要初始化一个链表。可以使用数组模拟链表,定义一个数组来存储元素的值和下一个元素的索引。通过设置头指针来记录链表的起始位置。 以下是使用数组模拟链表基本操作的C++代码示例: ```cpp #include<iostream> using namespace std; const int N = 100010; int e[N], ne[N], idx, head; void init() { head = -1; } void add_to_head(int x) { e[idx = x; ne[idx = head; head = idx; idx++; } void add(int k, int x) { e[idx = x; ne[idx = ne[k]; ne[k = idx; idx++; } void remove(int k) { ne[k = ne << " "; } return 0; } ``` 以上代码实现了链表的初始化、在头部插入元素、在指定位置插入元素和删除指定位置的元素的功能。在遍历输出链表时,使用头指针作为起始位置,通过下一个元素的索引来遍历链表并输出每个元素的值。 希望这个回答对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++课--链表基本操作](https://blog.csdn.net/weixin_50518617/article/details/117739895)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [c++链表基本操作(全)](https://blog.csdn.net/qq_64691289/article/details/126323294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值