专业编程基础技术教程

网站首页 > 基础教程 正文

C/C++单向链表的增加节点、删除节点实现

ccvgpt 2024-11-11 11:20:49 基础教程 9 ℃

前篇给大家分享了单向链表的简单实现,本文就继续跟大家分享关于链表的增、删、改、查。可能有的朋友没有看过前一篇文章,为了确保大家都能看懂,我将之前的链表的实现的代码给大家贴一份:

#include "stdafx.h"

C/C++单向链表的增加节点、删除节点实现

#include <stdio.h>

#include <iostream>

using namespace std ;

struct list

{

int num ;

list* next ;

};

list* creatList ()

{

//定義一個頭指針和一個臨時指針

list* head , *p;

//先需要開闢出來一個節點

head = new list ;

//让頭指針与中間變量指针指向同一个节点,让p去代替头去干累活

p = head ;

int num = 0;

while(true)

{

std::cout << "Please input the data for single linker : ";

std::cin >> num;

if(num != 0)

{

//开辟新的节点出来

list* temp = new list;

temp->num = num ;

//head 和 p在此時是指向同一個內存 同一個節點

p->next = temp ;

//此时p就指向了新增加的节点了

p = temp ;

}

else break;

}

//p 在此處成為尾節點

p->next = NULL ;

return head ;

}

int main()

{

list *test = creatList();

std::cout<<test->next->next->num<<std::endl;

list* node = test->next ;

while (node!=NULL)

{

list* p = node ;

node = node->next;

delete p ;

}

delete test ;

system("pause");

delete test

return 0 ;

}

这里,上一篇忘记封装一个释放链表的方法了,我写在main()方法中了,这里先把它封装了:

下面开始:实现节点的增加和删除。

增加节点

增加节点的方法分很多种,头插入法、尾插入法、中间插入法,头插和尾插都很简单,这里就将一下中间插入怎么实现:

因为头节点没有数据,所有头节点不算,思路是这样的:

1、先从头节点开始找到所需插入节点的序号对应的节点

2、新建立一个节点,给num赋值,再将新节点的next指向node next,然后将node的next指向新节点,这样就完成啦;

删除节点

默认不删头节点:

首先要判断要删的节点是否在链表中,然后大家要记得删除掉从链表中移除的节点,否则会造成内存泄露。

我们测试一下看下结果:

OK,结果没问题。至于查节点和改节点很简单,小编在这里就不多叙述了。

最后,附上源代码。注:小编只是为了给大家演示链表的原理并没有对代码做很好的封装,大家见谅,有兴趣的朋友可以用c++的类去封装一个。

#include "stdafx.h"

#include <stdio.h>

#include <iostream>

using namespace std ;

struct list

{

int num ;

list* next ;

};

list* creatList ()

{

//定義一個頭指針和一個臨時指針

list* head , *p;

//先需要開闢出來一個節點

head = new list ;

//让頭指針与中間變量指针指向同一个节点,让p去代替头去干累活

p = head ;

int num = 0;

while(true)

{

std::cout << "Please input the data for single linker : ";

std::cin >> num;

if(num != 0)

{

//开辟新的节点出来

list* temp = new list;

temp->num = num ;

//head 和 p在此時是指向同一個內存 同一個節點

p->next = temp ;

//此时p就指向了新增加的节点了

p = temp ;

}

else break;

}

//p 在此處成為尾節點

p->next = NULL ;

return head ;

}

void freeList(list* head)

{

list* node = head->next ;

while (node!=NULL)

{

list* p = node ;

node = node->next;

delete p ;

}

delete head ;

}

//中間插入

//head 需要插入的鏈錶 num 需要插入的數據 index为你要在哪个节点后面插入的序号

list* insert(list* head, int num, int index )

{

list* node, *insertNode,*node_next;

node = head->next ;

int i = 0 ;

while (node!=NULL)

{

if(i == index)

{

insertNode = new list;

insertNode->num = num ;

node_next = node->next ;

node->next = insertNode ;

insertNode->next = node_next ;

break;

}

node = node->next ;

i++ ;

}

if(i != index)cout<<"没有该节点"<<endl;

return head;

}

//head传入链表头节点 index为要删除的节点的序号,类似数组下标

list* deleteNode(list* head, int index )

{

list* node, *deleteNode;

node = head->next ;

int i = 0 ;

while (node!=NULL)

{

if(i == index -1)

{

if(node->next == NULL)cout<<"没有该节点"<<endl;

else

{

deleteNode = node->next ;

node->next = node->next->next;

delete deleteNode ;

}

break;

}

node = node->next ;

i++ ;

}

return head;

}

int main()

{

list *test = creatList();

std::cout<<test->next->next->num<<std::endl;

insert(test,124,2);

std::cout<<test->next->next->next->next->num<<std::endl;

deleteNode(test,2);

std::cout<<test->next->next->next->num<<std::endl;

freeList(test);

system("pause");

return 0 ;

}

Tags:

最近发表
标签列表