对单链表的操作

#include<iostream>
using namespace std;

typedef int Elemtype;
typedef struct Lnode {
	Elemtype data;
	struct Lnode* next;
}Lnode, * LinkList;

void InitList(LinkList &L)
{
	L = (Lnode*)malloc(sizeof(Lnode));
	L->next = NULL;
	//空表判断方法:L->next==NULL;
}

//按位序插入:在第i个位置插入元素e
bool ListInsert(LinkList& L, int i, Elemtype e)
{
	if (i < 1) return false;
	Lnode* p = L;//指针p指向当前扫描到的结点,初始化为头结点
	int jp = 0;//jp用于跟踪p当前指向的结点位置
	while (p != NULL && jp < i - 1)
	{
		p = p->next;
		jp++;
	}
	if (p == NULL) return false;//链表长度小于i-1
	//找到插入的位置后
	Lnode* s = (Lnode*)malloc(sizeof(Lnode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

//指定结点的后插操作(在p结点之后插入元素e)
bool InsertNextNode(Lnode* p, Elemtype e)
{
	if (p == NULL) return false;//p结点必须存在
	//将s连接在p结点后
	Lnode* s = (Lnode*)malloc(sizeof(Lnode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

//指定结点的前插操作
bool InsertLastNode(Lnode* p, Elemtype e)
{
	if (p == NULL) return false;// p结点必须存在
   //这里先在P结点之后连接一个结点S,然后再交换这两个结点的数据,S结点就在P结点前面了
	Lnode* s = (Lnode*)malloc(sizeof(Lnode));
	// 新节点s接收p节点的数据
	s->data = p->data;
	s->next = p->next;
	p->next = s;

	// 将新数据赋值给p结点
	p->data = e;
	return true;
}

//按位序删除:删除表 L 中第 i 个位置的元素,并用e 返回删除元素的值
bool ListDelete(LinkList& L, int i, Elemtype& e)
{
	if (i < 1) return false;
	Lnode* p = L;//指针p指向当前扫描到的结点
	int jp = 0;//当前jp(p)指向的是第几个结点
	while (p != NULL && jp < i - 1)
	{
		p = p->next;
		jp++;
	}
	if (p == NULL) return false;//i值要合法
	if (p->next == NULL) return false;//准备删除的结点必须存在
	Lnode* q = p->next;//令q指向被删除结点(可简化代码)
	e = q->data;
	p->next = q->next;
	free(q);//记得要释放内存
	return true;
}

//指定结点的删除操作(删除结点p)
bool DeleteNode(Lnode* p)
{
	if (p == NULL || p->next == NULL) return false; // 确保p结点存在且不是最后一个结点

	Lnode* q = p->next;
	p->data = q->data;
	p->next = q->next;
	free(q); //记得要释放内存
	return true;
}

//尾插法
LinkList CreatList_back(LinkList& L)
{
	int n;
	cin >> n;
	L = (LinkList)malloc(sizeof(Lnode));
	Lnode* s, * r = L;
	for (int i = 0; i < n; ++i)
	{
		int x;//假设插入n个整型x;
		cin >> x;
		s = (Lnode*)malloc(sizeof(Lnode));
		s->data = x;
		r->next = s;
		r = s;
	}
	r->next = NULL;
	return L;
}
//头插法
LinkList CreatList_head(LinkList& L)
{
	int n;
	cin >> n;
	L = (LinkList)malloc(sizeof(Lnode));//建立头结点
	L->next = NULL;//注意这里
	Lnode* s;
	for (int i = 0; i < n; ++i)
	{
		int x;//假设插入n个整型x;
		cin >> x;
		s = (Lnode*)malloc(sizeof(Lnode));
		s->data = x;
		s->next = L->next;
		L->next = s;
	}
	return L;
}


int main() {
	LinkList L;
	Elemtype e;
	bool result;

	// 初始化链表
	InitList(L);

	// 使用尾插法创建链表
	cout << "Creating list by appending elements...\n";
	CreatList_back(L);
	for (Lnode* p = L->next; p != NULL; p = p->next) {
		cout << p->data << " ";
	}
	cout << "\n";

	// 使用头插法创建链表
	cout << "Creating list by prepending elements...\n";
	CreatList_head(L);
	for (Lnode* p = L->next; p != NULL; p = p->next) {
		cout << p->data << " ";
	}
	cout << "\n";

	// 在第2个位置插入元素 99
	cout << "Inserting 99 at position 2...\n";
	result = ListInsert(L, 2, 99);
	if (result) {
		for (Lnode* p = L->next; p != NULL; p = p->next) {
			cout << p->data << " ";
		}
		cout << "\n";
	}

	// 删除第3个元素
	cout << "Deleting element at position 3...\n";
	result = ListDelete(L, 3, e);
	if (result) {
		cout << "Deleted element: " << e << "\n";
		for (Lnode* p = L->next; p != NULL; p = p->next) {
			cout << p->data << " ";
		}
		cout << "\n";
	}

	// 在指定节点后插入元素 77 (假设有足够节点)
	cout << "Inserting 77 after the first node...\n";
	result = InsertNextNode(L->next, 77);
	if (result) {
		for (Lnode* p = L->next; p != NULL; p = p->next) {
			cout << p->data << " ";
		}
		cout << "\n";
	}

	// 在指定节点前插入元素 88 (假设有足够节点)
	cout << "Inserting 88 before the second node...\n";
	result = InsertLastNode(L->next, 88);
	if (result) {
		for (Lnode* p = L->next; p != NULL; p = p->next) {
			cout << p->data << " ";
		}
		cout << "\n";
	}

	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BlueCatの夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值