链表排列(线性表)

题目描述

(线性表)已知不带头结点的线性链表list,链表中结点构造为(data、link),其中data为数据域,link为指针域。请写一算法,将该链表按结点数据域的值的大小从小到大重新链接。要求链接过程中不得使用除该链表以外的任何链结点空间。

输入

自定义链表节点数

m=5

3 1 5 4 6

输出

1 3 4 5 6

样例输入

8

10 1 5 14 32 55 67 6

样例输出

1 5 6 10 14 32 55 67

分析:

对于链表的排序个人认为用冒泡法比较好。此题,题目中明确规定了不仅可以用其余的空间变量来做。但是无奈,不用其他的,我做不出来。

#include"stdio.h"
#include"string.h"
typedef struct a{
  int node;
  struct a *next;
}*LinkList,Node;
//创建一个链表
void CreatListTail(LinkList *L,int m)
{
    LinkList p,r;
    int i;
    *L=(LinkList)malloc(sizeof(Node));
    r=*L;
    for(i=0;i<m;i++)
    {
        p=(LinkList)malloc(sizeof(Node));
        scanf("%d",&(p->node));
        r->next=p;
        r=p;
    }
    r->next=NULL;
}
int main()
{
    int m;
    int i,j;
    LinkList list,start,end,pre,T;
    while(~scanf("%d",&m))
    {
        CreatListTail(&list,m);


        pre=list;
        start=list;
        end=list;
        start=pre->next;
        end=start->next;
   //最多排序次数 一个循环中止条件
        while(m--)
        { pre=list;
          start=list->next;
           end=list->next->next;
            while(end!=NULL)
            {
                if(start->node>end->node)
                {
                    start->next=end->next;
                    end->next=start;
                    pre->next=end;
                    T=end;//之前的指向要归位。
                    /*其实这个交换一开始时处于不是使用其他变量来写的。但是水平有限。只能写到此步 */
                    end=start;
                    start=T;
                }
                pre=start;
                start=start->next;
                end=end->next;
            }
        }
        start=list->next;
        while(start!=NULL)
        {
            printf("%d ",start->node);
            start=start->next;
        }
    }

}


猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/85009160