- C语言代码
# include <stdio.h>
struct LinkNode {
int data;
struct LinkNode *next;
};
struct LinkNode * reverseLinkList(struct LinkNode *L) {
struct LinkNode *p, *head; //head是逆转后的头指针
if (L && L->next) { //至少两个结点
p = L->next;
head = reverseLinkList(p);
p->next = L;
L->next = NULL;
return head;
}
return L;
}
struct LinkNode * createLinkList() {
int data;
int flag = 0;
struct LinkNode *L, *p, *q;
printf("input your data:");
while(scanf("%d", &data) != EOF) {
q = (struct LinkNode *)malloc(sizeof(struct LinkNode));
q->data = data;
if (flag == 0) {
L = q;
p = L;
flag = 1;
}
else {
p->next = q;
p = q;
}
printf("input your data:");
}
p->next = NULL;
return L;
}
void printLinkList(struct LinkNode *L) {
struct LinkNode *s = L;
while (s) {
printf("%d\n", s->data);
s = s->next;
}
}
void printAndDestroyLinkList(struct LinkNode *L) {
struct LinkNode *r;
while (L) {
r = L->next;
printf("%d\n", L->data);
printf("地址%d\n", L);
free(L);
printf("销毁了一个结点\n");
L = r;
}
}
int main() {
struct LinkNode *testLinkList;
testLinkList = createLinkList();
printf("逆置前:\n");
printLinkList(testLinkList);
testLinkList = reverseLinkList(testLinkList);
printf("逆置后:\n");
printAndDestroyLinkList(testLinkList);
return 0;
}
-
环境说明
(1)编译器是Dev-C++
(2)C语言描述 -
运行说明
(1)运行之后的界面
(2)输入实例
输入链表【1,2,3,4,5】,输入最后一个结点“5”且回车,在新的“Input your data:”行输入“Ctrl+Z”,即可结束输入。(3)输出结果
首先程序会将输入的链表打印一次,然后将逆置后的链表打印并销毁。
-
补充说明
(1)注意用free()函数销毁结点;
(2)注意C语言中结构体的使用规则。