#include <stdio.h>
#include <stdlib.h>
typedef struct student
{
int number;
char name[20];
int score;
struct student *next;
}student;typedef struct list {
int a;
struct list *next;
}List,*LIST;
List *createList ();
void paixu(LIST L);//比较笨拙的一种方法
List *reverse(LIST L);
int main()
{
LIST p;
List *q;
int i=0;
p = createList();
q = p->next;
//printf("output all element.\n");
while(q!=NULL)
{
++i;
printf("%d \n",q->a);
q = q->next;
}
//paixu(p);
reverse(p);
q = p->next;
printf("排序结果:\n");
while(q!=NULL)
{
++i;
printf("%d \n",q->a);
q = q->next;
}
}
List *createList ()
{
LIST ph;
List * p ,*q;
int element;
//create the head of the list;
ph = (List *)malloc(sizeof(List));
ph->a = 0;
ph->next = NULL;
q = ph;
printf("Please input the elemnet:\n");
scanf("%d",&element);
while(element != 99999)//如果输入的值为99999,则表示输入结束,此处有待改进
{
p = (List *)malloc(sizeof(List));
p->a = element;
q->next = p ;
q = p;
scanf("%d",&element);
}
p->next = NULL;
return ph;
}
void paixu(LIST L)
{
int len = 1 ;
int i=0,j=0;
List * p=L->next;
List *q=p;
int temp;
while(p->next != NULL)
{
p = p->next;
len++;
}
p = q;
printf("\nLEN = %d\n",len);
for(;i<len/2;++i)
{
j = i;
for(;j+i != len-1;j++)
{
q=q->next;
}
temp = p->a;
p->a = q->a;
q->a = temp;
p = p->next;
q = p;
}
}
List *reverse(LIST L)
{
List *p1,*p2,*p3;
if(L == NULL ||L->next == NULL)
return L;
p1=L->next; //p1指向链表头节点的下一个节点
p2=p1->next;
p1->next=NULL;
while(p2)
{
p3=p2->next;
p2->next = p1;
p1=p2;
p2=p3;
}
//printf("p1 = %d,next = %d\n ",p1->number,p1->next->number);
L->next=p1; //将链表头节点指向p1
return L;
}
List *reverse(LIST L)
分析:
假设需要逆序的单链表为:
则逆序以后的链表为:
过程:
(1)取p1指向header->next
(2)取p3保留p2->next
循环一次修改以后的单链表如下:
(3)重复步骤(2)
循环一次修改以后的单链表如下:
(4)将header->next指向p1,完成整个单链表的逆序