回 帖 发 新 帖 刷新版面

主题:给几个单链表排序的算法函数!

大家给几个单链表排序的函数,
谢谢了
单链表类型定义
typedef struct node{
    int data;
    struct node *next;
}lnode,*linklist;
直接插入排序单链表的不会做
希望大家给点提示
最好写出实现排序的函数

回复列表 (共4个回复)

沙发

可以考虑插入法排序.

板凳

/*单链表排序*/
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
    int data;
    struct node *next;
}lnode,*linklist;

linklist InsertSort(linklist h)//注意要设置一个头结点,以方便寻找和插入元素
{
      linklist th = h; //指向当前被插入位置的前驱
      linklist pre; //指向当前最小值(被插入的元素)的前驱
      linklist p; //指向当前最小值
      linklist r; //临时指针,用来寻找当前最小值
      int min; //存储当前最小值

      while (th->next != NULL)//遍历原单链表
      {
            p = r = th->next; //p,r开始指向当前被插入位置
            min = r->data;
            while (r != NULL) //遍历链表,寻找当前最小值
            {
                  if (r->data < min)
                  {
                        min = r->data; //存储当前最小值
                        p = r;    //指向当前最小值
                  }
                  r = r->next;
            }

            pre = th;
            while (pre->next != p) //寻找当前最小值的前驱,并用pre指向它
                  pre = pre->next;

            //把p插入到th的后面
            if (th->next != p)
            {
                  pre->next = p->next;
                  p->next = th->next;
                  th->next = p;
            }
            th = th->next;
      }

      return h;//返回头指针
}
//////////////////////测试函数////////////////////////////
void Print(linklist h);
linklist CreateList(int a[], int len);//用来构造一个链表
void ListInsert(linklist h, int x);//构造一个数据域为X的新结点

int main()
{
      linklist head;
      int a[5]={3,2,1,48,5};

      head = CreateList(a, 5);
      Print(head);

      head = InsertSort(head);
      Print(head);

    getchar();
      return 0;
}

void Print(linklist h)
{
      linklist p = h->next;
      while (p != NULL)
      {
            printf("%d ", p->data);
            p = p->next;
      }
      printf("\n");
}

linklist CreateList(int a[], int len)//用来构造一个链表
{
      linklist Head;
      int i;

    Head = (linklist)malloc(sizeof(lnode)); //为链表的头结点分配空间
    if(!Head)
    {
        printf("Out of space!");
        return NULL;
    }
    Head->next = NULL;

    for(i=0; i<len; i++)
    {
        ListInsert(Head, a[i]); //把新结点S插到头结点后面。
    }
    return Head;
}

void ListInsert(linklist h, int x)//构造一个数据域为X的新结点
{
    linklist S;

    S = (linklist)malloc(sizeof(lnode));//为新结点分配空间
    if(!S)
    {
        printf("Out of space!");
        exit(1);
    }
    S->data = x;
    S->next = h->next;
    h->next = S;
}

3 楼

再给你一个,这个原链表不带头结点的.
/*单链表排序*/
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
    int data;
    struct node *next;
}lnode, *linklist;

linklist Sort(linklist h)
{
      linklist Head;/*建立一个头结点*/
      linklist p, q, r, s;

      p = Head = (linklist)malloc(sizeof(lnode)); //为链表的头结点分配空间
    if(!Head)
    {
        printf("Out of space!");
        return NULL;
    }
    p->next = h;

      while (p->next != NULL)
      {
            q = p->next;
            r = p;
            while (q->next != NULL)
            {
                  if (q->next->data < r->next->data)
                         r = q;      //r指向当前最小值的前驱
                  q = q->next;
            }
            if (r != p) //若r!=p,把其后继(当前最小值)插入到p的后面
            {
                  s = r->next;
                  r->next = s->next;
                  s->next = p->next;
                  p->next = s;
            }
            p = p->next; //指向当前被插入位置的前驱
      }

      h = Head->next;
      free(Head);
      return h;
}

//////////////////////测试函数////////////////////////////
linklist Create(int a[], int n);

int main()
{
      linklist head, p;
      int a[5]={3,2,1,48,5};

      head = Create(a, 5);
      printf("before arrange:\n");
      for (p=head; p; p=p->next)
             printf("%d ", p->data);
      printf("\n");

      head = Sort(head);
      printf("after arrange:\n");
      for (p=head; p; p=p->next)
             printf("%d ", p->data);
      printf("\n");

    getchar();
      return 0;
}


linklist Create(int a[], int n)/*建立一个单链表*/
{
      linklist h, s;
      
      for (h=NULL; n; n--)
      {
            s = (linklist)malloc(sizeof(lnode));//为新结点分配空间
          if(!s)
          {
              printf("Out of space!");
              exit(1);
          }
            s->data = a[n-1];
            s->next = h;
            h = s;
      }
      
      return h;
}

4 楼

谢谢了
今后还得多多指教!

我来回复

您尚未登录,请登录后再回复。点此登录或注册