【C++知识点】链表(整理)

  1. 链表的创建
  2. 链表的遍历
  3. 链表节点的添加
  4. 链表节点的删除

链表的创建

	SNode* pNewNode = new SNode();   //创建新节点
	cout << "请输入ID和名字" << endl;
	cin >> pNewNode->nID >> pNewNode->strName;
	pTailNode->pNext = pNewNode;   //把创建的节点接到尾部(接)
	pTailNode = pNewNode;    //将节点换为新的尾部(换)
	//从第一节开始跟随(老师版)
	Snake* pPreNode = pHead;
	for (Snake* pCurNode = pHead->pNext; pCurNode; pCurNode = pCurNode->pNext)
	{
		pCurNode->backup();
		pCurNode->nSnakeRow = pPreNode->nSnakeRowBk;
		pCurNode->nSnakeCol = pPreNode->nSnakeColBk;
		pPreNode = pPreNode->pNext;  //pPreNode = pCurNode;
	}
	Snake* pPreNode = pHead;  //创建前一个指针从头开始
	Snake* pCurNode = pHead->pNext;  //创建当前指针指向 前一个指针的 下一个节点
	while (pCurNode)  //如果当前指针存在:最后一个指针
	{
		pCurNode->backup();  //先备份当前坐标:用于给后面的使用
		//跟随
		pCurNode->nSnakeRow = pPreNode->nSnakeRowBk;  //把前一节的备份坐标给当前节点
		pCurNode->nSnakeCol = pPreNode->nSnakeColBk;

		//指针往后移
		pPreNode = pPreNode->pNext;
		pCurNode = pCurNode->pNext;
	}

链表的遍历

	//创建一个指针用于遍历输出
	SNode* pCurNode = g_pHead;
	while (pCurNode){
		//输出当前节点的数据
		cout << "ID = " << pCurNode->nID << "," << "Name = " << pCurNode->strName << endl;
		//将当前节点设置为下一个节点
		pCurNode = pCurNode->pNext;
	}
	//老师版
	bool DrawSnake = false;
	for (Snake* pDrawNode = pHead; pDrawNode; pDrawNode = pDrawNode->pNext)
	{
		if (pDrawNode->nSnakeRow == i && pDrawNode->nSnakeCol == j)
		{
			DrawSnake = true;
			break;
		}
	}
	//自己版
	bool DrawSnake = false;
	Snake* pDrawNode = pHead;
	while (pDrawNode)
	{
		if (pDrawNode->nSnakeRow == i && pDrawNode->nSnakeCol == j)
		{
			DrawSnake = true;
			break;
		}
		pDrawNode = pDrawNode->pNext;
	}

链表节点的插入删除

// 2021.3.22(链表插入删除).cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>

using namespace std;

struct SNode
{
	SNode(){
		nID = 0;
		pNext = nullptr;
	}
	int nID;
	string strName;
	SNode* pNext;
};

//定义头结点
SNode* g_pHead = nullptr; //new SNode();

void createList(int nCount);  //创建链表
void showList();  //打印链表
void addNode(int nIndex);   //添加节点
void deleteNode(int nIndex);  //删除节点

int _tmain(int argc, _TCHAR* argv[])
{
	//在main中调用函数实现相应功能
	createList(3);  //长度为5
	showList();
	addNode(0);  //从0插入节点
	showList();
	deleteNode(0);
	showList();
	system("pause");
	return 0;
}


//其他函数写在main函数之外
void createList(int nCount){
	if (nCount <= 0) 
	{
		return;   //返回调用处,并结束当前函数
	}

	g_pHead = new SNode();  //创建头结点并输入数据
	cout << "请输入ID和名字" << endl;
	cin >> g_pHead->nID >> g_pHead->strName;
	
	SNode* pTailNode = g_pHead;    //创建尾指针(第一个节点既是头也是尾)

	int i = 0;
	while (i < (nCount - 1))
	{
		SNode* pNewNode = new SNode();   //创建新节点
		cout << "请输入ID和名字" << endl;
		cin >> pNewNode->nID >> pNewNode->strName;
		pTailNode->pNext = pNewNode;   //接到尾部
		pTailNode = pNewNode;
		i++;
	}
}

void showList()
{
	cout << "-----------------------打印链表------------------------" << endl;

	//创建一个指针用于遍历输出
	SNode* pCurNode = g_pHead;
	while (pCurNode){
		//输出当前节点的数据
		cout << "ID = " << pCurNode->nID << "," << "Name = " << pCurNode->strName << endl;
		//将当前节点设置为下一个节点
		pCurNode = pCurNode->pNext;
	}
}

//通过索引搜索节点★★★
SNode* getNodeByIndex(int nIndex)
{
	int i = 0;
	SNode* pCurNode = g_pHead;
	while (pCurNode)
	{
		pCurNode = pCurNode->pNext;
		i++;
		if (i == nIndex)
		{
			return pCurNode;
		}
	}
	return nullptr;
}

void addNode(int nIndex)
{
	//创建一个新节点并输入数据
	SNode* pNewNode = new SNode();
	cout << "请输入ID和名字" << endl;
	cin >> pNewNode->nID >> pNewNode->strName;

	if (nIndex <= 0)  //在链表头插入数据
	{
		pNewNode->pNext = g_pHead;    //把头结点的地址赋给新节点的pNext
		g_pHead = pNewNode;       //新节点变成头结点
		return;     //结束函数
	}

	SNode* pCurNode = getNodeByIndex(nIndex - 1);   //先通过index搜索节点的插入位置
	pNewNode->pNext = pCurNode->pNext;   //把搜索到的节点的pNext设为待插入节点的pNext
	pCurNode->pNext = pNewNode;    //再让搜索到的节点的pNext等于新节点
}

void deleteNode(int nIndex)
{
	//删除第一个
	SNode* pNewNode = new SNode; //创建临时变量存放头结点
	if (nIndex <= 0)
	{
		pNewNode = g_pHead;  //把头结点存起来,用于后面释放
		g_pHead = g_pHead->pNext; //把第二个节点设为新的头结点

		if (pNewNode)
		{
			delete pNewNode;
			pNewNode = nullptr;
		}
		return;
	}


	//删除第nIndex个
	SNode* pPreNode = getNodeByIndex(nIndex -1);
	SNode* pCurNode = pPreNode->pNext;
	pPreNode->pNext = pCurNode->pNext;
	if (pCurNode)
	{
		//删除操作
		delete pCurNode;
		pCurNode = nullptr;
	}

	//删除最后一个
	if (!pCurNode)
	{
		return;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值