//10.9 已知单链表,写一算法将其逆置
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char data; //data 为ijiedian的数据信息
struct node *next; //next 为指向后继节点的指针
}LNode; //单链表节点类型
LNode *CreateLinkList() //生成单链表
{
LNode *head, *p, *q;
char x;
head = (LNode *)malloc(sizeof(LNode)); //生成头节点
head->next = NULL;
p = head;
q = p; //指针q 始终指向链尾节点
printf("Input any char string:\n");
scanf("%c", &x);
while (x != '\n')
{
p = (LNode *)malloc(sizeof(LNode));
p->data = x;
p->next = NULL;
q->next = p; //在链尾插入
q = p;
scanf("%c", &x);
}
return head; //返回指向单链表的头指针head
}
void Convert(LNode *H) //单链表逆置
{
LNode *p, *q;
p = H->next; //p指向剩余节点链表的第一个数据节点
H->next = NULL; //新链表H初始化为空
while (p != NULL)
{
q = p; //从剩余节点链表中取出第一个节点
p = p->next; //p继续指向剩余节点链表新的第一个数据节点
q->next = H->next; //将取出的节点*q插入到新链表H的链首
H->next = q;
}
}
int main()
{
LNode *A, *p;
A = CreateLinkList(); //生成单链表A
Convert(A); //单链表A逆置
p = A->next; //输出逆置后的单链表A
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
return 0;
}