将一个带头结点的数据域依次为 a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个 结点的数据域变为 an,…,最后一个结点的数据域为 a1。编程实现以上功能要求用C语言
时间: 2024-05-04 11:22:03 浏览: 105
以下是一个简单的C语言程序,实现了将单链表所有结点逆置的功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建单链表
Node* createLinkedList(int n) {
Node *head, *tail, *p;
head = (Node*) malloc(sizeof(Node));
tail = head;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
p = (Node*) malloc(sizeof(Node));
p->data = x;
p->next = NULL;
tail->next = p;
tail = p;
}
return head;
}
// 输出单链表
void printLinkedList(Node* head) {
Node* p = head->next;
while (p != NULL) {
printf("%d", p->data);
p = p->next;
if (p != NULL) {
printf(" -> ");
}
}
printf("\n");
}
// 将单链表逆置
void reverseLinkedList(Node* head) {
Node *p, *q, *r;
p = head->next;
q = NULL;
while (p != NULL) {
r = p->next;
p->next = q;
q = p;
p = r;
}
head->next = q;
}
// 主函数
int main() {
int n;
printf("Please input the length of the linked list: ");
scanf("%d", &n);
Node* head = createLinkedList(n);
printf("Original linked list:\n");
printLinkedList(head);
reverseLinkedList(head);
printf("Reversed linked list:\n");
printLinkedList(head);
return 0;
}
```
程序中,我们首先定义了一个单链表结构体 `Node`,包含数据域 `data` 和指向下一个结点的指针 `next`。然后通过 `createLinkedList()` 函数创建一个带头结点的单链表。接着使用 `printLinkedList()` 函数输出原始的单链表。最后通过 `reverseLinkedList()` 函数将单链表逆置,并再次使用 `printLinkedList()` 函数输出逆置后的单链表。
阅读全文