#include<stdio.h>
#include<stdlib.h>
struct Node
{
char data;
struct Node* next;
};
short list_Length;//全局变量list_Length记录当前表长
struct Node* head;//全局指针head, 负责指向当前链表的头结点
struct Node* rear;//全局指针rear, 负责指向当前表尾结点: 如果表为空, 那么rear指向头结点
void Create_LinkList()//创建链表, 即初始化头结点
{
head=(struct Node*)malloc(sizeof(struct Node));
if(head!=NULL)//结点申请成功
{
head->data=0;//头结点的数据域置零
rear=head;//表尾指针暂时指向头结点
head->next=NULL;
list_Length=0;
}
else//结点申请失败
{
printf("头结点申请失败!\n");
}
return ;
}
void Node_Insert(char c)//插入新结点到链表中
{
struct Node* p;
p=(struct Node*)malloc(sizeof(struct Node));//申请新的Node结点
if(p!=NULL)//结点申请成功
{
p->data=c;//新结点的数据由函数外传入
p->next=NULL;
rear->next=p;//插入结点前的表尾结点的next指针指向当前结点
rear=p;//表尾指针指向当前新申请结点
list_Length++;//表长+1
}
else
{
printf("结点申请失败!\n");
return ;
}
}
void f()//逆序输出当前链表中的数据
{
int i, n=list_Length;
struct Node* p;
while(n>=1)
{
i=1;
p=head;p指针指向头结点
while(i<=n)
{
p=p->next;
i++;
}//找到表中第n个结点
putchar(p->data);//输出当前数据域中的值
putchar(' ');//输出一个空格符
n--;
}
return ;
}
void Traversal()//遍历链表并输出各结点数据域中的值
{
struct Node* p;
p=head->next;
while(p!=NULL)
{
putchar(p->data);//输出当前结点数据域中的值
putchar(' ');//输出一个空格符
p=p->next;
}
return ;
}
int main()
{
char c;
Create_LinkList();//创建头结点
while(1)
{
c=getchar();//输入一个字符
Node_Insert(c);
if(getchar()=='\n')//输入一个空格符或回车符, 如果输入回车符, 输入结束
break;
}
f();
return 0;
}