线性链表(单链表)的基本操作的实现

#include<iostream>
#include<cstdlib>
using namespace std;
//结点结构体
struct Node {
	int a;
	struct Node *pNext;
};
//链表头尾指针
struct Node *g_pHead = NULL;
struct Node *g_pEnd = NULL;
//创建链表,在链表中增加一个数据   头添加
void AddListHead(int a) {
	//创建一个结点
	struct Node* pTemp = (struct Node*) malloc(sizeof(struct Node));
	//节点数据进行赋值	
	pTemp->a = a;
	pTemp->pNext = NULL;
	//如果链表为空
	if (NULL == g_pHead || NULL == g_pEnd) {
		g_pHead = pTemp;
		g_pEnd = pTemp;
	}
	//不为空链表
	else {
		pTemp->pNext = g_pHead;//将该数据的下一个指向原有链表的头
		g_pHead = pTemp;		//将该数据定为为新链表的头
	}
}
//创建链表,在链表中增加一个数据   尾添加
void AddListEnd(int a) {
	//创建结点
	struct Node* pTemp = (struct Node*) malloc(sizeof(struct Node));
	//节点数据进行赋值		
	pTemp->a = a;
	pTemp->pNext = NULL;
	//如果链表为空
	if (NULL == g_pHead || NULL == g_pEnd) {
		//空链表 既是头也是尾
		g_pHead = pTemp;
		g_pEnd = pTemp;
	}
	//不为空链表
	else {
		g_pEnd->pNext = pTemp;//原有链表的尾的下一个指针指向该结点
		g_pEnd = pTemp; 	   //原有链表的尾的下一个指针指向该结点
	}
}
void ScanList() {
	cout << "链表中元素:" << endl;
	//定义中间指针
	struct Node *pTemp = g_pHead;
	while (pTemp != NULL) {
		cout << pTemp->a <<" "; //输出该结点的值
		pTemp = pTemp->pNext;
	}
	cout << endl;
}
//查询指定的结点
struct Node* SelectNode(int a) {
	//定义中间指针
	struct Node* pTemp = g_pHead;
	while (pTemp != NULL) {
		if (a == pTemp->a) {
			return pTemp;		//查询到,返回该结点的值
		}
		pTemp = pTemp->pNext;
	}
	return NULL;			//未查询到返回值为NULL
}
//指定位置插入结点
void AddListRand(int index, int a) {
	//链表为空
	if (NULL == g_pHead) {
		cout << "链表没有节点" << endl;
		return;
	}
	//找位置
	struct Node* pt = SelectNode(index);
	if (NULL == pt) {
		cout << "没有指定节点" << endl;
	}
	//有此结点
	//给a创建结点
	struct Node* pTemp = (struct Node*)malloc(sizeof(struct Node));
	//结点成员赋值
	pTemp->a = a;
	pTemp->pNext = NULL;
	if (pt == g_pEnd) {
		g_pEnd->pNext = pTemp;
		g_pEnd = pTemp;
	}
	else {
		pTemp->pNext = pt->pNext;
		pt->pNext = pTemp;
	}
}
//尾删除   
void DeleteListEnd() {
	//链表为空
	if (NULL == g_pEnd) {
		cout << "链表为空,无需释放" << endl;
		return;
	}

	// 链表只有一个结点
	if (g_pHead == g_pEnd) {
		free(g_pHead);		//释放该结点(删除该结点)
		g_pEnd = NULL;
		g_pHead = NULL;
	}
	else {
		//链表有多个结点
		struct Node* pt = g_pEnd;
		//找到尾巴的前一个结点
		struct Node* ptemp = g_pHead;
		while (ptemp->pNext != g_pEnd) {
			ptemp = ptemp->pNext;
		}
		ptemp->pNext = NULL;//将尾结点的上一个结点的下一个的指针指向NULL
		g_pEnd = ptemp;
		free(pt);       //释放节点(删除该结点)
	}
}
//头删除   
void DeleteListHead() {
	//链表为空
	if (NULL == g_pHead) {
		cout << "链表为空,无需释放" << endl;
		return;
	}
	// 链表只有一个节点
	if (g_pHead == g_pEnd) {
		free(g_pHead);	//释放该结点(删除该结点)
		g_pEnd = NULL;
		g_pHead = NULL;
	}
	//多个结点
	else {
		struct Node* pTemp = g_pHead;//定义中间指针记录原有链表的头
		g_pHead = g_pHead->pNext;//将链表头设置为原链表的下一个
		free(pTemp);		//释放该结点(删除该结点)
	}
}
//删除指定结点
void DeleteListRand(int a) {
	//链表判断
	if (NULL == g_pHead) {
		cout << " n o" << endl;
		return;
	}
	struct Node* pTemp = SelectNode(a);//调用查询函数,查询值为a的结点,并赋值给中间结点pTemp
	// 无
	if (NULL == pTemp) {
		cout << "查无此节点" << endl;
		return;
	}
	//找到了
	//只有一个结点
	if (g_pHead == g_pEnd) {
		free(g_pHead);
		g_pHead = NULL;
		g_pEnd = NULL;
	}
	//两个结点
	else if (g_pHead->pNext == g_pEnd) {
		if (g_pHead == pTemp) {//如果头为指定结点
			DeleteListHead();//调用函数删除头结点
		}
		if (g_pEnd == pTemp) {//如果尾为指定节点
			DeleteListEnd();//调用函数删除尾结点
		}
	}
	//多个结点
	else {
		if (g_pHead == pTemp) {//如果头为指定结点
			DeleteListHead();//调用函数删除头结点
		}
		else if (g_pEnd == pTemp) {//如果尾为指定节点
			DeleteListEnd();//调用函数删除尾结点
		}
		else {
			//创建中间结点
			struct Node* ptemp = SelectNode(a);//调用查询函数,查询值为a的结点,并赋值给中间结点pTemp
			//找到之后
			ptemp->pNext = pTemp->pNext;
			free(pTemp);  //释放该结点
		}
	}
}
//清空链表
void freeList() {
	struct Node* pTemp = g_pHead;
	while (pTemp != NULL) {
		struct Node* pt = pTemp;
		pTemp = pTemp->pNext;
		free(pt);
	}
	//头尾清空
	g_pHead = NULL;
	g_pEnd = NULL;
}

int main() {
	int n;
	int x, y;
	for (int i = 0; i < 10; i++) {
		AddListHead(i);//头添加
	}
	ScanList();
	freeList();
	for (int i = 0; i < 10; i++) {
		AddListEnd(i);//尾添加
	}
	ScanList();//遍历所有并输出
	cout << "查询指定结点:" << endl;
	cin >> n;
	SelectNode(n);//查指定,并输出
	cout << "指定位置插入结点:" << endl;
	cin  >>x >> y;
	AddListRand(x, y);//指定位置插入结点
	ScanList();
	cout <<"删除尾结点"<< endl; 
	DeleteListEnd();
	ScanList();
	cout << "删除头结点" << endl; 
	DeleteListHead();
	ScanList();
	cout << "删除指定结点" << endl; 
	cin >> n;
	DeleteListRand(n);
	ScanList();
	cout << "清空链表" << endl; 
	freeList();
	system("pause");
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值