如何用C语言实现一个可接受任意长度和元素的双向链表(包括头结点),既能顺序创建也能逆序创建?并且在主函数中分别显示顺序和逆序创建的链表,以及它们合并后的链表内容?
时间: 2024-10-23 21:20:25 浏览: 28
在C语言中,我们可以使用结构体表示链表节点,并为链表提供添加、删除和翻转的功能。首先,我们定义一个链表节点的结构:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* prev; // 指向前一个节点
struct Node* next; // 指向下一个节点
} Node;
// 创建一个新的节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 添加节点到链表尾部(顺序)
void append(Node** head, int value) {
if (*head == NULL) {
*head = createNode(value);
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = createNode(value);
temp->next->prev = temp;
}
}
// 逆序添加节点到链表尾部(逆序)
void reverseAppend(Node** head, int value) {
if (*head == NULL) {
*head = createNode(value);
} else {
Node* temp = *head;
Node* newHead = createNode(value);
newHead->prev = *head;
*head = newHead;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = *head;
*head->prev = temp;
}
}
// 显示链表(顺序)
void displayForward(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 显示链表(逆序)
void displayReverse(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->prev;
}
printf("\n");
}
int main() {
Node* forwardList = NULL;
Node* reverseList = NULL;
// 顺序创建链表
for (int i = 5; i >= 1; i--) {
append(&forwardList, i);
}
// 逆序创建链表
for (int i = 1; i <= 5; i++) {
reverseAppend(&reverseList, i);
}
// 显示顺序链表
printf("顺序链表: ");
displayForward(forwardList);
// 显示逆序链表
printf("逆序链表: ");
displayReverse(reverseList);
// 合并两个链表(将逆序链表接在顺序链表之后)
Node* mergedList = forwardList;
Node* mergeTemp = reverseList;
if (mergeTemp != NULL) {
while (mergeTemp != NULL) {
mergedList->next = mergeTemp;
mergeTemp = mergeTemp->prev;
mergedList = mergedList->next;
}
mergedList->next = NULL;
}
// 显示合并后的链表
printf("合并后的链表: ");
displayForward(mergedList);
// 清理内存
free(forwardList);
free(reverseList);
free(mergedList);
return 0;
}
```
在这个示例中,我们首先创建了两个链表,一个按顺序,另一个按逆序。然后展示了这两个链表的内容,并通过将逆序链表接到顺序链表的尾部实现了合并。注意在最后清理了分配的内存,以防止内存泄漏。
阅读全文