您的位置:首页 > 其它

单链表逆序

2012-03-06 21:15 218 查看
#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

p1=stu->next;

p2保留p1->next p2=p1->next;

将p1->next置为NULL,因为单链表逆序以后,当前的p1节点为尾节点 p1->next=NULL;

(2)取p3保留p2->next p3=p2->next;

将p2插入p1之前 p2->next
= p1;

p1指向p2指向的节点 p1=p2;

p2指向p3指向的节点 p2=p3;



循环一次修改以后的单链表如下:





(3)重复步骤(2)





循环一次修改以后的单链表如下:





(4)将header->next指向p1,完成整个单链表的逆序

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: