用C语言实现(1) 用头插法(或尾插法)建立带头节点的单向链表。 (2) 对已建立的单向链表实现有关查找,插入,删除,等操作。
时间: 2024-05-08 07:21:27 浏览: 85
C语言尾插法建立链表并正序输出建立正序链表.zip
以下是用头插法建立带头节点的单向链表,并实现相关操作的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 初始化一个带头节点的链表
ListNode* initList() {
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
return head;
}
// 头插法插入节点
void insertNodeAtHead(ListNode* head, int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = head->next;
head->next = newNode;
}
// 尾插法插入节点
void insertNodeAtTail(ListNode* head, int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
ListNode* p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = newNode;
}
// 查找节点
ListNode* searchNode(ListNode* head, int val) {
ListNode* p = head->next;
while (p != NULL && p->val != val) {
p = p->next;
}
return p;
}
// 删除节点
void deleteNode(ListNode* head, int val) {
ListNode* p = head;
while (p->next != NULL && p->next->val != val) {
p = p->next;
}
if (p->next != NULL) {
ListNode* temp = p->next;
p->next = temp->next;
free(temp);
}
}
// 打印链表
void printList(ListNode* head) {
ListNode* p = head->next;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main() {
ListNode* head = initList();
insertNodeAtHead(head, 3);
insertNodeAtHead(head, 2);
insertNodeAtHead(head, 1);
printf("链表初始化后:");
printList(head);
insertNodeAtTail(head, 4);
insertNodeAtTail(head, 5);
printf("插入两个节点后:");
printList(head);
printf("查找节点3:");
ListNode* p = searchNode(head, 3);
if (p != NULL) {
printf("找到了!\n");
} else {
printf("没找到!\n");
}
printf("删除节点2后:");
deleteNode(head, 2);
printList(head);
return 0;
}
```
这个程序中,我们使用了头插法和尾插法插入节点,同时也实现了查找和删除节点的操作。你可以根据自己的需要进行扩展,比如插入节点时可以让用户输入节点值,删除节点时可以提示用户要删除的节点值。
阅读全文