编写一个C语言程序,实现线性表的链式存储定义,完成单链表的创建(头插法、尾插法)、插入、删除、查找等常用操作,将线性链表逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,以此类推。并输出运行结果。
时间: 2024-09-28 15:03:19 浏览: 4
在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;
}
// 尾插法添加元素
void insertAtTail(Node** head, int value) {
Node* newNode = createList();
newNode->data = value;
if (*head == NULL) {
*head = newNode;
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
// 删除指定值的节点
void deleteNode(Node** head, int value) {
if (*head == NULL) {
return;
}
Node* temp = *head;
Node* prev = NULL;
if (temp->data == value) {
*head = temp->next;
free(temp);
return;
}
while (temp != NULL && temp->data != value) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) {
return;
}
prev->next = temp->next;
free(temp);
}
// 查找节点
Node* searchNode(Node* head, int value) {
Node* current = head;
while (current != NULL) {
if (current->data == value) {
return current;
}
current = current->next;
}
return NULL;
}
// 逆置链表
void reverseList(Node** head) {
Node* prev = NULL;
Node* current = *head;
Node* nextTemp = NULL;
while (current != NULL) {
nextTemp = current->next;
current->next = prev;
prev = current;
current = nextTemp;
}
*head = prev;
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
Node* head = NULL;
// 添加一些元素
insertAtHead(&head, 5);
insertAtTail(&head, 3);
insertAtHead(&head, 7);
insertAtTail(&head, 1);
printf("Original list:\n");
printList(head);
// 删除特定元素
deleteNode(&head, 7);
printList(head);
// 查找元素
Node* foundNode = searchNode(head, 3);
if (foundNode != NULL) {
printf("Found node with value %d.\n", foundNode->data);
} else {
printf("Value not found.\n");
}
// 逆置链表
reverseList(&head);
printf("\nReversed list:\n");
printList(head);
return 0;
}
```
这个程序实现了链表的基本操作,包括创建、插入、删除、查找和逆置。当你运行这个程序,它会创建一个链表,然后演示如何使用这些操作。