基于带头结点的链式存储结构,编写程序,实现下述功能: 初始化一个空链表 链表的置空和销毁 实现元素的查找、插入和删除 输出链表的全部元素 链表元素的排序及有序链表的合并(选做) 链表的原地逆置(选做) 假定处理的线性表元素是int型的数据。 C语言
时间: 2024-10-24 21:11:17 浏览: 18
一算法可实现两个非递减的线性表的合并,采用链式存储结构,能够输出合并前和合并后链表的内容
基于C语言,我们可以创建一个简单的单向链表结构,并实现所需的功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化一个空链表
Node* createList() {
return (Node*)malloc(sizeof(Node));
}
// 插入节点到链表头部
void insertAtHead(Node** head, int value) {
Node* newNode = createList();
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
// 查找元素
Node* search(Node* head, int value) {
while (head != NULL) {
if (head->data == value)
return head;
head = head->next;
}
return NULL;
}
// 删除指定值的节点
void deleteNode(Node** head, int value) {
Node* temp = *head, *prev;
// 如果头节点就是目标节点
if (temp != NULL && temp->data == value) {
*head = temp->next; // 更新头节点
free(temp); // 释放原头节点内存
return;
}
// 遍历链表寻找目标节点
while (temp != NULL && temp->data != value) {
prev = temp;
temp = temp->next;
}
// 如果找到目标节点
if (temp != NULL) {
prev->next = temp->next; // 将当前节点从链表中移除
free(temp); // 释放节点内存
}
}
// 输出链表元素
void printList(Node* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
// 简单排序并输出已排序的链表
void sortAndPrint(Node** head) {
if (*head == NULL || (*head)->next == NULL)
return;
Node* end = *head;
while (end->next != NULL)
end = end->next;
for (Node* it = *head; it != end; it = it->next) {
for (Node* j = it; j != end; j = j->next) {
if (j->data > it->data) {
int temp = it->data;
it->data = j->data;
j->data = temp;
}
}
}
printList(*head);
}
// 原地逆置链表
void reverseList(Node** head) {
Node* prev = NULL, *current = *head, *next;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
*head = prev;
}
int main() {
Node* head = createList(); // 初始化空链表
// 插入元素
insertAtHead(&head, 5);
insertAtHead(&head, 3);
insertAtHead(&head, 7);
// 打印链表
printf("Original list: ");
printList(head);
// 删除元素
deleteNode(&head, 3);
// 查找元素
Node* foundNode = search(head, 7);
if (foundNode != NULL)
printf("Found element: %d\n", foundNode->data);
else
printf("Element not found.\n");
// 排序并打印链表
sortAndPrint(&head);
// 逆置链表
reverseList(&head);
// 输出逆置后的链表
printf("Reversed list: ");
printList(head);
// 销毁链表
destroyList(head);
return 0;
}
// 示例函数,未在此代码中实际实现,用于链表销毁
void destroyList(Node* head) {
Node* temp = head;
while (temp != NULL) {
Node* nextTemp = temp->next;
free(temp);
temp = nextTemp;
}
}
```
在这个例子中,我们首先定义了链表节点结构,然后实现了链表的创建、插入、查找、删除、打印、排序、逆置以及简单销毁操作。注意,`destroyList()` 函数在这里未实际实现,它是一个辅助函数,用于释放整个链表的内存。如果你需要,可以添加相应的代码来实现这个函数。
阅读全文