c语言,实现带头结点的单链表的就地逆置
时间: 2023-10-10 22:08:03 浏览: 73
好的,我可以回答这个问题。以下是C语言实现带头结点的单链表就地逆置的代码:
```C
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
void CreateList(LinkList *L, int n); // 创建带头结点的单链表
void ReverseList(LinkList *L); // 就地逆置带头结点的单链表
void PrintList(LinkList L); // 输出带头结点的单链表
int main() {
LinkList L;
int n;
printf("请输入单链表长度:");
scanf("%d", &n);
CreateList(&L, n);
printf("逆置前:");
PrintList(L);
ReverseList(&L);
printf("逆置后:");
PrintList(L);
return 0;
}
void CreateList(LinkList *L, int n) {
Node *p, *q;
int i;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
q = *L;
for (i = 0; i < n; i++) {
p = (Node*)malloc(sizeof(Node));
printf("请输入第%d个节点的值:", i + 1);
scanf("%d", &(p->data));
p->next = NULL;
q->next = p;
q = p;
}
}
void ReverseList(LinkList *L) {
Node *p, *q;
if (*L == NULL || (*L)->next == NULL) {
return;
}
p = (*L)->next;
(*L)->next = NULL;
while (p != NULL) {
q = p->next;
p->next = (*L)->next;
(*L)->next = p;
p = q;
}
}
void PrintList(LinkList L) {
Node *p;
p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```