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

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

程序如下:

#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的

后一位。

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

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

 

转载于:https://www.cnblogs.com/yidianyuan/archive/2012/11/02/2751753.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值