上个博客已经讲解了单链表的创建和节点的添加,那么今天我们就继续来学习链表的遍历输出和节点的删除。
目录
1. 链表的遍历输出
void printList(struct Node* headNode) {
struct Node* pMove = headNode->next;
while (pMove)//不为空时
{
printf("%d ", pMove->data);
pMove = pMove->next;
}printf("\n");
}
2. 节点的删除
解决思路:定义posNode为要删除的值对应的节点,posNodeFront为要删除节点的前面的一个节点。首先判断posNode节点是否为空,如果为空,则表示此链表是空链表;否则开始逐个节点寻找要删除的节点,直至找到posNode节点。最后让posNodeFront的next指针指向posNode的下一个节点,释放要删除节点的空间即可。
void deleteNodeByAppoin(struct Node* headNode, int posDate) {
//从headNode->next开始找posNode这个节点对应的数据
struct Node* posNode = headNode->next;
struct Node* posNodeFront = headNode;
if (posNode == NULL) {
printf("无法删除,链表为空\n");
}
else {
while (posNode->data != posDate) {
posNodeFront = posNode;//前面位置到达了后面节点的位置
posNode = posNodeFront->next;//后面位置变成了原来位置的下一个
if (posNode == NULL) {
printf("未找到指定位置,无法删除\n");
break;
}
}
posNodeFront->next = posNode->next;
free(posNode);
}
}
3. 完整代码
#include<stdio.h>
#include<stdlib.h>
//创建节点
struct Node {
int data;
struct Node* next;
};
//创建链表
struct Node* createList() {
//创建一个指针来表示表头
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
headNode->next = NULL;
return headNode;
}
//创建节点
struct Node* createNode(int data) {
//创建一个新的指针节点
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
//结构体变量初始化
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//插入 头插法
void insertNodeByHead(struct Node* headNode, int data) {
struct Node* newNode = createNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//插入 尾插法
void insertNodeByTail(struct Node* headNode, int data) {
struct Node* newNode = createNode(data);
while (headNode->next != NULL)
{
headNode = headNode->next;//找到最后一个节点
}
headNode->next = newNode;
newNode->next = NULL;
}
//中间插入数据
void insertNodeByCenter(struct Node* headNode, int data, int i) {
struct Node* posNode = headNode;
/*struct Node* posNodeFront = headNode;*/
struct Node* newNode = createNode(data);
if (posNode == NULL) {
printf("无法查找此数据,链表为空\n");
}
else {
while (posNode->data != i) {
posNode = posNode->next;//前面位置到达了后面节点的位置
/*posNode = posNodeFront->next;*///后面位置变成了原来位置的下一个
if (posNode == NULL) {
printf("未找到此数据\n");
break;
}
}
newNode->next = posNode->next;
posNode->next = newNode;
}
}
//打印遍历
void printList(struct Node* headNode) {
struct Node* pMove = headNode->next;
while (pMove)//不为空时
{
printf("%d ", pMove->data);
pMove = pMove->next;
}printf("\n");
}
//删除链表的数据
void deleteNodeByAppoin(struct Node* headNode, int posDate) {
//从headNode->next开始找posNode这个节点对应的数据
struct Node* posNode = headNode->next;
struct Node* posNodeFront = headNode;
if (posNode == NULL) {
printf("无法删除,链表为空\n");
}
else {
while (posNode->data != posDate) {
posNodeFront = posNode;//前面位置到达了后面节点的位置
posNode = posNodeFront->next;//后面位置变成了原来位置的下一个
if (posNode == NULL) {
printf("未找到指定位置,无法删除\n");
break;
}
}
posNodeFront->next = posNode->next;
free(posNode);
}
}
int main() {
//定义一个结构体指针来创建链表
struct Node* List = createList();
insertNodeByHead(List, 1);
insertNodeByHead(List, 2);
insertNodeByHead(List, 3);
printf("头插法插入数据后遍历:");
printList(List);
deleteNodeByAppoin(List, 2);
printf("删除数据2后遍历:");
printList(List);
insertNodeByTail(List, 4);
printf("尾插法插入数据4后遍历:");
printList(List);
insertNodeByCenter(List, 5, 1);
printf("中间插法把数据5插入到数据%d后遍历:", 1);
printList(List);
system("pause");
return 0;
}
4. 运行结果
好了,我们单链表的学习就结束了,有什么问题可以在评论区留言哟!!!