用c语言编写程序建立一个带有头结点的单向链表,链表结点中的数据通过键盘输入,当输入0时,表示结束(链表头结点的data域不放数据,表空条件是next==NULL)。且输出数字的排列与输入数字的排列相反
时间: 2023-12-14 09:36:52 浏览: 231
以下是用c语言编写的带有头结点的单向链表程序,可以实现数字的输入、存储、输出,并且输出的排列与输入的相反:
```c
#include <stdio.h>
#include <stdlib.h>
/*定义链表结构体*/
typedef struct Node {
int data; /*数据域*/
struct Node *next; /*指针域*/
} Node, *LinkList;
/*链表初始化*/
void InitList(LinkList *L) {
/*创建头结点*/
(*L) = (Node*)malloc(sizeof(Node));
(*L)->next = NULL;
}
/*创建链表*/
void CreateList(LinkList L) {
Node *p, *q;
int x;
q = L;
printf("请输入数字,以0结束:\n");
scanf("%d", &x);
while (x != 0) {
/*创建新结点*/
p = (Node*)malloc(sizeof(Node));
p->data = x;
p->next = NULL;
/*将新结点插入到链表末尾*/
q->next = p;
q = p;
scanf("%d", &x);
}
}
/*输出链表*/
void PrintList(LinkList L) {
Node *p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
/*反转链表*/
void ReverseList(LinkList L) {
Node *p, *q, *r;
q = NULL; /*q指向当前遍历到的结点的前一个结点*/
p = L->next;
while (p != NULL) {
r = p->next; /*r指向当前遍历到的结点的下一个结点*/
p->next = q; /*将当前遍历到的结点指向前一个结点*/
q = p; /*将当前遍历到的结点赋值给q*/
p = r; /*将当前遍历到的结点的下一个结点赋值给p*/
}
L->next = q; /*将头结点指向反转后的链表的第一个结点*/
}
int main() {
LinkList L;
InitList(&L); /*初始化链表*/
CreateList(L); /*创建链表*/
printf("输入的数字:");
PrintList(L); /*输出链表*/
ReverseList(L); /*反转链表*/
printf("输出的数字:");
PrintList(L); /*输出链表*/
return 0;
}
```
程序中,首先定义了链表结构体,包含数据域和指针域。然后定义了链表初始化、创建、输出和反转等函数。在主函数中,首先初始化链表,然后通过输入数字创建链表,并输出输入的数字。接着将链表反转,并输出反转后的数字。
阅读全文