数据结构单链表的题目 希望有高人帮忙解答 谢谢!

设Listhead为一单链表的头指针,单链表的每个结点由一个整数域DATA和指针域NEXT组成,整数在单链表重视无序的。编写程序,将Listhead链中结点分成奇数链和偶... 设Listhead为一单链表的头指针,单链表的每个结点由一个整数域DATA和指针域NEXT组成,整数在单链表重视无序的。编写程序,将Listhead链中结点分成奇数链和偶数链,分别由P,Q指向,每个链中的数据按由小到大排列。注意:程序中不能重新申请空间 用C语言 展开
 我来答
kutpbpb
2009-08-24 · TA获得超过528个赞
知道小有建树答主
回答量:332
采纳率:0%
帮助的人:386万
展开全部

为了提高效率,最后采用了下面的算法。

思路如下:

1.首先将单链表调整为前半部分为奇数,后半部分为偶数的序列;

2.扫描链表,找到分界,拆分成两个子链表;

3.对奇偶子链表排序;

其中第一步算法:

 从头开始扫描,p指像当前节点,q指向后继;

1.若p->data为奇数,则继续后移;

2.若p->data为偶数,

  (1)当q->data为偶数时,q指针后移,P不变,直到找到一个奇数为止,此时Q节点为找到奇数节点;这时,可交换P和Q节点的Data域,p和Q均后移一步;

   (2)当q->data为奇数时,q指针后移,P不变,直到找到一个偶数数为止,此时Q节点为找到偶数的前驱节点;这时,可交换P和Q节点(偶数的前驱节点)的Data域,p指向Q,Q后移;       

下面为程序代码:(采用无头节点链表)

void AdjustList(LinkList &L){ 

 //把单链表调整为前半部分为奇数,后半部分为偶数的单链表的调整函数。

 LinkList p,q;

 int temp;

 p=L->next;

 q=p->next;

 while(q){

   if(p->data%2==1)

   {

  p=q;

  q=q->next;

   }

   else{

      temp=q->data%2;

      switch(temp)

      {

      case 0:

        while(q&&q->data%2==0)

      q=q->next;

        if(q){

              Swap(p->data,q->data);

           p=p->next;

           q=q->next;

        }

        break;

     case 1:

        while(q&&(q->data%2==1)&&(q->next)

      &&((q->next)->data)%2!=0)

        q=q->next;

        if(q){

            Swap(p->data,q->data);

            p=q;

            q=q->next;

        }

       break;

     default:  ;

    } 

    }

 }

 printf("\n Out the Adjust whole List:");

 Print_L(L);

 

void SpiltList(LinkList &L,LinkList &L1,LinkList &L2){

 //找到奇数序列与偶数序列的分界,直接拆分的函数;

 LinkList p,q;

 p=L;

 q=p->next;

 while(q&&q->data%2!=0){

  p=q;

  q=q->next;

 }

 L2=p->next;

 p->next=NULL;

 L1=L;  

void  Sort(LinkList &L){

 //对链表排序;

 LinkList p,q,min; 

 for(p=L;p->next!=NULL;p=p->next){

  min=p;

  for(q=p->next;q!=NULL;q=q->next)

   if(q->data<min->data)

    min=q;

     Swap(p->data,min->data);

 }

}

我这有完整运行程序,只给你关键的模块,对于你的问题,这三个函数足够了,希望你能得到你想要的东西,ok!

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式