//链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的
//链表由两部份组成 数据域和指针域(指向下一个节点的指针)最后一个节点指针域为NULL
struct SNode{
SNode(){
this->nID = 0;
this->nextNode = nullptr;
}
int nID;
SNode* nextNode;
};
//创建长度为len的链表
void createList(SNode* head,int len){
SNode* lastNode = head;//表尾 表示最后一个节点
for (int i = 0; i < len-1; i++)
{
SNode* pNode = new SNode();
pNode->nID = i+1;
lastNode->nextNode = pNode;//新节点为表尾指向的下一个节点
lastNode = pNode;//更新表尾
}
}
//遍历链表
void visitList(SNode* head){
SNode* pCurNode = head;//当前节点
while (pCurNode)
{
cout << pCurNode->nID << endl;
pCurNode = pCurNode->nextNode;
}
}
//查找某个节点
SNode* findNode(SNode* head,int index){
SNode* pCurNode = head;//当前节点
int num = 0;
while (pCurNode){
if (index==num){
return pCurNode;
}
num++;
pCurNode = pCurNode->nextNode;
}
return nullptr;
}
//插入节点
void insertNode(int index,SNode*& head,SNode* insertNode){
if (index<0){
cout << "----索引越界----" << endl;
return;
}
SNode* pCurNode = head;
int num = 0;
//头节点前面插入新节点
if (0==index){
insertNode->nextNode = head;
head = insertNode;
return;
}
while (pCurNode){
if (num==index-1){
insertNode->nextNode = pCurNode->nextNode;
pCurNode->nextNode = insertNode;
break;
}
pCurNode = pCurNode->nextNode;
num++;
}
cout << "----索引越界----" << endl;
}
//删除节点
SNode* deleteNode(int index,SNode*& head){
SNode* pCurNode = head;//被删除的节点的上一个节点
SNode* pDeleteNode = nullptr;//被删除的节点
int num = 0;
if (0==index){
pDeleteNode = head;
head = pCurNode->nextNode;
}
while (pCurNode){
if (num==index-1){
pDeleteNode = pCurNode->nextNode;
if (pDeleteNode){//删除空节点会出错,所以要判空
pCurNode->nextNode = pDeleteNode->nextNode;
break;
}
}
pCurNode = pCurNode->nextNode;
num++;
}
return pDeleteNode;//后续可能会需要用到被删除的那个节点
}
//逆序
SNode* reverseList(SNode* head){
SNode* pCurNode = head;
SNode* pNextNode = nullptr;
SNode* pTemp = nullptr;
while (pCurNode)
{
pNextNode = pCurNode->nextNode;
pCurNode->nextNode = pTemp;
pTemp = pCurNode;
pCurNode = pNextNode;
}
return pTemp;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "-----创建链表----" << endl;
SNode* pHead = new SNode();//头节点
createList(pHead,3);
cout << "----插入节点----" << endl;
SNode* newNode = new SNode();
newNode->nID = 6;
newNode->nextNode = nullptr;
insertNode(1, pHead, newNode);
cout << "----遍历链表----" << endl;
visitList(pHead);
cout << "----查找节点----" << endl;
SNode* pNode=findNode(pHead,2);
if (pNode)
{
cout << pNode->nID << endl;
cout << pNode->nextNode << endl;
}
else
{
cout << "节点不存在" << endl;
}
cout << "----删除节点后遍历链表----" << endl;
SNode* p=deleteNode(3,pHead);
visitList(pHead);
cout << "----逆序链表----" << endl;
SNode* newHead = reverseList(pHead);
visitList(newHead);
system("pause");
return 0;
}
01-20
06-05
696