请使用C语言编写一个带有尾结点和头节点的链表并具有增删改查的功能
时间: 2024-05-02 18:23:48 浏览: 110
链表-使用C语言实现非循环双向链表-带头结点+尾结点.zip
好的,我可以给您提供一个带有头节点和尾节点的链表的C语言实现,包含增加、删除、修改和查找功能。下面是代码实现:
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data; // 数据域
struct Node* next;// 指针域
} Node;
// 初始化链表,创建头节点和尾节点,返回链表头指针
Node* initList(void) {
Node* head = (Node*) malloc(sizeof(Node)); // 创建头节点
Node* tail = (Node*) malloc(sizeof(Node)); // 创建尾节点
head->next = tail; // 头结点指向尾节点
tail->next = NULL; // 尾节点的下一个节点为空
return head;
}
// 向链表中插入数据
Node* insertNode(Node* head, int data) {
Node* newNode = (Node*) malloc(sizeof(Node)); // 创建新节点
newNode->data = data; // 新节点存储数据
newNode->next = head->next; // 新节点指向头结点的下一个节点
head->next = newNode; // 头结点指向新节点
return head;
}
// 删除链表中的节点
Node* deleteNode(Node* head, int data) {
Node* p = head->next; // p指向头结点的下一个节点
Node* q = head; // q指向头结点
while (p != NULL) {
if (p->data == data) { // 如果找到要删除的节点
q->next = p->next;
free(p); // 释放删除节点内存空间
printf("已删除节点: %d\n", data);
return head;
}
q = p; // q指向p
p = p->next; // p指向下一个节点
}
printf("链表中未找到要删除的节点: %d\n", data);
return head;
}
// 修改链表中节点的数据
Node* modifyNode(Node* head, int oldData, int newData) {
Node* p = head->next; // p指向头结点的下一个节点
while (p != NULL) {
if (p->data == oldData) { // 如果找到要修改的节点
p->data = newData; // 修改节点的数据
printf("已修改%d为%d\n", oldData, newData);
return head;
}
p = p->next; // p指向下一个节点
}
printf("链表中未找到要修改的节点: %d\n", oldData);
return head;
}
// 查找链表中的节点
Node* searchNode(Node* head, int data) {
Node* p = head->next; // p指向头结点的下一个节点
while (p != NULL) {
if (p->data == data) { // 如果找到要查找的节点
printf("在链表中找到了节点: %d\n", data);
return p;
}
p = p->next; // p指向下一个节点
}
printf("在链表中未找到节点: %d\n", data);
return NULL;
}
// 输出链表数据
void printList(Node* head) {
Node* p = head->next; // p指向头结点的下一个节点
while (p != NULL) {
printf("%d ", p->data); // 打印节点数据
p = p->next; // p指向下一个节点
}
printf("\n");
}
// 销毁链表
void destroyList(Node* head) {
Node* p = head;
Node* q = head->next;
while (q != NULL) {
free(p); // 释放节点内存空间
p = q; // p指向下一个节点
q = q->next;
}
free(p); // 释放头结点内存空间
printf("链表已销毁!\n");
}
int main() {
Node* head = initList(); // 初始化链表
insertNode(head, 1); // 向链表中插入节点
insertNode(head, 2);
insertNode(head, 3);
insertNode(head, 4);
printList(head); // 输出链表中的数据
modifyNode(head, 3, 30); // 修改节点数据
printList(head);
deleteNode(head, 2); // 删除节点
printList(head);
searchNode(head, 5); // 查找节点
searchNode(head, 3);
destroyList(head); // 销毁链表
return 0;
}
```
注意,在此提供的代码实现中,使用了头节点和尾节点,尾节点的存在可以使得链表的增加和删除操作更加方便。增加数据时,将新节点放在头结点的后面;删除数据时,从头结点开始查找,找到要删除的节点并删除。同时,该实现还提供了修改和查找功能。最后,注意在使用完成后要销毁链表,避免对内存空间的占用。
阅读全文