- 链表的创建
- 链表的遍历
- 链表节点的添加
- 链表节点的删除
链表的创建
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;
}
}