用C语言实现对不带头结点的单链表的基本操作的代码
时间: 2024-05-04 16:21:38 浏览: 128
带头结点单链表基本操作.doc
以下是用C语言实现对不带头结点的单链表的基本操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct Node {
int data; // 数据域
struct Node* next; // 指针域
};
// 在链表尾部插入节点
void insertAtEnd(struct Node** head_ref, int new_data) {
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); // 创建新节点
struct Node* last = *head_ref; // 定义指向最后一个节点的指针
new_node->data = new_data; // 填充新节点数据
new_node->next = NULL; // 新节点的 next 指针赋值为空
// 如果链表为空,将新节点设为头节点
if (*head_ref == NULL) {
*head_ref = new_node;
return;
}
// 遍历链表,找到最后一个节点
while (last->next != NULL) {
last = last->next;
}
// 将新节点接在链表尾部
last->next = new_node;
}
// 在链表中删除指定值的节点
void deleteNode(struct Node** head_ref, int key) {
struct Node* temp = *head_ref; // 定义指向当前节点的指针
struct Node* prev = NULL; // 定义指向当前节点前一个节点的指针
// 如果头节点的数据为要删除的数据
if (temp != NULL && temp->data == key) {
*head_ref = temp->next; // 修改头节点
free(temp); // 释放原头节点内存
return;
}
// 遍历链表,找到要删除的节点
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
// 如果找到了要删除的节点
if (temp != NULL) {
prev->next = temp->next; // 修改前一个节点的 next 指针
free(temp); // 释放要删除的节点内存
}
}
// 打印链表
void printList(struct Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
struct Node* head = NULL; // 定义头节点
// 在链表尾部插入节点
insertAtEnd(&head, 1);
insertAtEnd(&head, 2);
insertAtEnd(&head, 3);
printf("Original list: ");
printList(head);
// 删除节点
deleteNode(&head, 2);
printf("Updated list: ");
printList(head);
return 0;
}
```
运行结果:
```
Original list: 1 2 3
Updated list: 1 3
```
阅读全文