/*
Author:c++_cracker007小朋友
Date:200904023
*/
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
char name[20];
struct node *link;
}stud; /*声明链表*/
stud* ReverseList(stud* head) //反转链表的指向
{
stud *p,*q,*r; /*辅助结点*/
p = head; /*首结点赋给p*/
q = p->link; /*p的下一个结点为q*/
/*
循环如下:
开始: p->q->r
举例: 1->2->3
q ->link = p; 之后: q->p
举例: 2->1
最后: r->q
举例 3->2
*/
while (strcmp(q->name,"-1")) /*当q所指结点的数据域为-1时,退出这个循环*/
{
r = q ->link; /*q的下一个结点为r,也就是第三个结点为r*/
q ->link = p; /*没有执行此句之前q->link为第三个结点r*/
/*执行此句之后,p变为q->link,p变成了q的下一个结点*/
p = q;/*让q变成p,即第二个结点变成第一个结点*/
q = r;/*让r变成q,即让第三个结点变成第二个结点*/
}
free(q);/*释放q的内存*/
head->link = NULL;/*原来的链头变成链尾*/
head = p;/*原来的链尾变成链头*/
return head;
}
int main(int argc, char *argv[])
{
stud* head=(stud*)malloc(sizeof(stud));/*给链表分配内存*/
stud* p=head;
scanf("%s",p->name);
while(strcmp(p->name,"-1"))/*建立链表,遇到-1就跳出循环*/
{
p->link=(stud*)malloc(sizeof(stud));
p=p->link;
scanf("%s",p->name);
}
head=ReverseList(head);
p=head;
while(p) /*输出链表*/
{
printf("%s\n",p->name);
p=p->link;
}
p=head->link;
while(p) /*释放链表*/
{
free(head);
head=p;
p=p->link;
}
free(head);
system("PAUSE");
return 0;
}