C语言编码实现并注释:将一个带头结点的数据域依次为 al ,a2,…, an ( n ≥3)的单链表的所有结点逆置,即第一个结点的数据域变为 an ,…,最后一个结点的数据域为 al 。编程实现以上功能要求。
时间: 2024-03-21 07:41:20 浏览: 15
以下是C语言编码实现并注释:
```c
#include<stdio.h>
#include<stdlib.h>
//定义链表结点的数据类型
typedef struct Node{
int data; //结点的数据域
struct Node* next; //结点的指针域
}Node;
//创建带头结点的单链表
Node* createList(int n){
Node* head = (Node*)malloc(sizeof(Node)); //创建头结点
head->next = NULL; //头结点的指针域初始化为NULL
Node* p = head; //创建指向当前结点的指针
int i;
for(i = 1; i <= n; i++){
Node* newNode = (Node*)malloc(sizeof(Node)); //创建新结点
newNode->data = i; //为新结点赋值
newNode->next = NULL; //新结点的指针域初始化为NULL
p->next = newNode; //将新结点连接到当前结点的后面
p = newNode; //将指向当前结点的指针指向新结点
}
return head; //返回头结点
}
//遍历链表并输出每个结点的值
void traverseList(Node* head){
Node* p = head->next; //从第一个结点开始遍历
while(p != NULL){ //当指针指向的结点不为空时
printf("%d ", p->data); //输出当前结点的值
p = p->next; //将指针指向下一个结点
}
printf("\n");
}
//将链表中的所有结点逆置
void reverseList(Node* head){
Node* p = head->next; //从第一个结点开始逆置
Node* q = NULL; //定义指向前一个结点的指针
Node* r = NULL; //定义指向下一个结点的指针
while(p != NULL){ //当指针指向的结点不为空时
r = p->next; //将指向下一个结点的指针指向当前结点的下一个结点
p->next = q; //将指向下一个结点的指针指向前一个结点
q = p; //将指向前一个结点的指针指向当前结点
p = r; //将指向当前结点的指针指向下一个结点
}
head->next = q; //将头结点的指针域指向逆置后的第一个结点
}
int main(){
Node* head = createList(5); //创建带头结点的单链表
printf("Original list: ");
traverseList(head); //遍历链表并输出每个结点的值
reverseList(head); //将链表中的所有结点逆置
printf("Reversed list: ");
traverseList(head); //遍历链表并输出每个结点的值
return 0;
}
```
注释说明:
1. 定义了链表结点的数据类型 `Node`,包括结点的数据域和指针域;
2. 创建了带头结点的单链表,其中 `n` 表示链表中结点的个数;
3. 遍历链表并输出每个结点的值;
4. 将链表中的所有结点逆置,使用三个指针 `p`、`q`、`r` 分别指向当前结点、前一个结点和后一个结点,通过修改结点的指针域实现逆置;
5. 输出逆置后的链表。