将链表逆序排列的一个程序及思考的对链表依某一元素排序方法

遇到将链表逆序排列的问题,一开始觉得肯定会很复杂,后来猛然想到用数组存放地址

程序如下:

#include <stdio.h>
#include <stdlib.h>
#define N 6 
typedef struct student 
  {int num; 
   char name[8]; 
   int age;
   struct student *next; 
  }BT; 

void main() 
{
 BT a[N]={{100,"Lui",20},{101,"Wang",21},{102,"LI",21},{105,"zhang",22},{106,"Wei",22},{107,"Guo",23}};
    int i,m,j;
 BT *p1,*p2,*head,*p3,*q[N+2];
 p1=a;
 head=a;
 p2=head;
 printf("List a:\n");
    for(i=1;i<=N;i++)
 {
  p3=p1;
  printf("%8d% 8s %8d\n",p1->num,p1->name,p1->age);
  p1->next=a+i;
  p1=p1->next;
 } 
 p3->next=NULL;//这里使用p1和p3是不一样的
 printf("\n\n");

 p1=head;
 i=0;
 while(p1!=NULL)
 {  
  q[i]=p1;
  printf("地址值为:%d\n",q[i]);
  p1=p1->next;
  i++;  
 }
 printf("\n\n");

 head=q[i-1];
 p1=head;
 for(j=i-2;j>-1;j--)
 {
  p1->next=q[j];
  p1=p1->next;
 }
 p1->next=NULL;//倒序排列时这里要用p1,而不是用p3,用p3的话会少一个值。
 
 p1=head;
 while(p1!=NULL)
 {
  printf("%8d% 8s %8d\n",p1->num,p1->name,p1->age);
  p1=p1->next;
 }    
 system("pause");
}

这里说下标注的地方,的处理,第一处使用p1->next=NULL,会导致逆序后溢出,因为p1是p3的

后一位。

根据这个思路,对链表排序,可以将要排序的元素,顺序放到一数组中,同时将个地址也存放在一数组中,

按元素排序的同时将地址移动,之后将地址赋给指针即可。

 

posted on 2012-11-02 18:53  天涯古人  阅读(217)  评论(0编辑  收藏  举报

导航