鱼C论坛

 找回密码
 立即注册
查看: 4209|回复: 15

双向链表的插入排序,顺便问问单链表怎样写插入排序》??

[复制链接]
发表于 2013-4-25 22:01:10 | 显示全部楼层 |阅读模式
20鱼币
#include <stdio.h>
#include <stdlib.h>
typedef struct _list
{
    int elem;
    struct _list *pPre;
    struct _list *pNext;
}List;
List *CreatList()//创建一个双线链表
{
    List *pHead = (List*)malloc(sizeof(List));
    pHead->pNext = pHead->pPre = pHead;
    return pHead;
}
void InsertList(List *pHead,int elem)//头插法插入数据函数
{
     List *pCur = pHead,*pTemp = pCur->pNext;
    List *pNew = (List*)malloc(sizeof(List));
    pNew->elem = elem;//数据初始化
//以下是插入过程
    pNew->pNext = pCur->pNext;
    pCur->pNext = pNew;

    pNew->pPre = pTemp->pPre;
    pTemp->pPre = pNew;
}
void Print(List *pHead)//打印链表函数
{
    List *pCurrent = pHead->pNext;
    while(pCurrent!=pHead)
    {
        printf("%d,",pCurrent->elem);
        pCurrent = pCurrent->pNext;
    }
}
void main()
{
    List *pHead = CreatList();
    List *pCur = pHead->pNext,*pPrev,*pT=pHead;
    int data[] = {1,32,4,3,24,2,5},count = 0,i = 0;
    count = sizeof(data)/sizeof(data[0]);
    for(i=0;i<count;i++)
    {
        InsertList(pHead,data[i]);
    }
  //下面是插入法排序的算法,
    while(pCur->pNext!=pHead)
    {
        pPrev = pCur;
        for(pT=pPrev->pPre;pT!=pHead;pT=pT->pPre)
        {
            if(pT->elem <= pPrev->elem)
            {
               break;
            }
        }
        pPrev->pNext = pT->pNext;
        pT->pNext = pPrev;
        pPrev->pPre = pT->pNext->pPre;
        pT->pNext->pPre = pPrev;

    }
    Print(pHead);
}我觉得插入法的算法是对的,但就是不能运行,为什么??求大神解决,另外那个单向链表的插入法的算法该如何解决??

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-4-25 23:56:05 | 显示全部楼层
老实说没怎么看懂你的代码,双向链表我也不是很懂,所以查资料搞了半天也没全搞出来。
大概你的意思是先创建一个双向循环链表,插入元素,然后排序,最后输出。
改了一部分,可以实现创建,插入还有输出了,排序还没看,没想到办法呢
明天学习一下再看
以下是代码,仅供参考:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct _list
  4. {
  5.         int elem;
  6.         struct _list *pPre;
  7.         struct _list *pNext;
  8. }List;
  9. List *CreatList()//创建一个双线链表
  10. {
  11.         List *pHead = (List*)malloc(sizeof(List));
  12.         pHead->elem = 0;
  13.         pHead->pNext = pHead->pPre = NULL;
  14.         return pHead;
  15. }
  16. void InsertList(List *pHead,int elem)//头插法插入数据函数
  17. {
  18.        
  19.         if ((pHead->pNext==NULL) && (pHead->pPre==NULL))
  20.         {
  21.                 pHead->elem = elem;//数据初始化
  22.                 pHead->pNext = pHead->pPre = pHead;

  23.         }else
  24.         {
  25.                 List *pCur = pHead,*pTemp = pCur->pNext;
  26.                 List *pNew = (List*)malloc(sizeof(List));
  27.                 pNew->elem = elem;//数据初始化
  28.                 pNew->pNext = pHead;
  29.                 pNew->pPre = pHead->pPre;

  30.                 pHead->pPre->pNext = pNew;
  31.                 pHead->pPre = pNew;

  32.         }
  33.        
  34.        
  35. }
  36. void Print(List *pHead)//打印链表函数
  37. {
  38.         printf("%d,",pHead->elem);
  39.         List *pCurrent = pHead->pNext;
  40.         while(pCurrent!=pHead)
  41.         {
  42.                 printf("%d,",pCurrent->elem);
  43.                 pCurrent = pCurrent->pNext;
  44.         }
  45. }
  46. void main()
  47. {
  48.         List *pHead = CreatList();
  49.         List *pCur = pHead,*pPrev,*pT=pHead;
  50.         int data[] = {1,32,4,3,24,2,5},count = 0,i = 0;
  51.         count = sizeof(data)/sizeof(data[0]);
  52.         for(i=0;i<count;i++)
  53.         {
  54.                 InsertList(pHead,data[i]);
  55.         }
  56.         //下面是插入法排序的算法,
  57. //         while(pCur->pNext!=pHead)
  58. //         {
  59. //                 pPrev = pCur;
  60. //                 for(pT=pPrev->pPre;pT!=pHead;pT=pT->pPre)
  61. //                 {
  62. //                         if(pT->elem <= pPrev->elem)
  63. //                         {
  64. //                                 break;
  65. //                         }
  66. //                 }
  67. //                 pPrev->pNext = pT->pNext;
  68. //                 pT->pNext = pPrev;
  69. //                 pPrev->pPre = pT->pNext->pPre;
  70. //                 pT->pNext->pPre = pPrev;
  71. //
  72. //         }
  73.         Print(pHead);
  74.         getchar();
  75. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-26 00:01:30 | 显示全部楼层
又学会了一招
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-26 00:23:14 | 显示全部楼层
本帖最后由 向往青莲 于 2013-4-26 00:26 编辑

while(pCur->pNext!=pHead)
    {
        pPrev = pCur;
        for(pT=pPrev->pPre;pT!=pHead;pT=pT->pPre) //第一次跑到这里,然后不成立,就跑过for循环
        {
            if(pT->elem <= pPrev->elem)
            {
               break;
            }
        }
        pPrev->pNext = pT->pNext;//来到这里就开始出错了  你的链表最后一个节点指向Head节点,不是指向Head->pNext节点,Head节点只是便于操作的指针,没有数值,而你又用前指针排序,肯定错误,因为看了很久不知道你到底打算怎么排序,所以我就直接来来个冒泡排序,你懂得
        pT->pNext = pPrev;
        pPrev->pPre = pT->pNext->pPre;
        pT->pNext->pPre = pPrev;

    }
  1. void main()
  2. {
  3.     List *pHead = CreatList();
  4.     List *pCur = pHead->pNext,*pPrev,*pT=pHead;
  5.     int data[] = {1,32,4,3,24,2,5},count = 0,i = 0, j=0, Temp;
  6.     count = sizeof(data)/sizeof(data[0]);
  7.     for(i=0;i<count;i++)
  8.     {
  9.         InsertList(pHead,data[i]);
  10.     }
  11.   //???????????,
  12.         for (i=0 ; i < count; i++)
  13.         {
  14.                 pT = pCur->pNext;
  15.                 for(j=count-i; j>0; j--)
  16.                 {
  17.                         if (pT->elem < pCur->elem)
  18.                         {
  19.                                 Temp = pCur->elem;
  20.                                 pCur->elem = pT->elem;
  21.                                 pT->elem = Temp;
  22.                         }
  23.                         pT = pT->pNext;
  24.                 }
  25.                 pCur = pCur->pNext;
  26.         }
  27.         Print(pHead);
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-26 15:38:27 | 显示全部楼层
学习{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-26 16:56:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-26 16:59:45 | 显示全部楼层
小新110 发表于 2013-4-25 23:56
老实说没怎么看懂你的代码,双向链表我也不是很懂,所以查资料搞了半天也没全搞出来。
大概你的意思是先创 ...

还是很谢谢你的,希望你能给我答案,插入法排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-26 17:56:15 | 显示全部楼层
一介白书生 发表于 2013-4-26 16:56
还是很感谢你,我这个还是想用插入法排序实现哈

话说啥叫插入法排序   我一般需要这种时候都是查书的   完全没去记这些排序的名称   抱歉啊    因为挺忙的  就懒得弄了   have a good luck
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-27 10:54:26 | 显示全部楼层
一介白书生 发表于 2013-4-26 16:59
还是很谢谢你的,希望你能给我答案,插入法排序

同问,啥叫  插入法排序?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-28 09:19:45 | 显示全部楼层
看看,长知识了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-8 20:47:22 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-8 13:55:35 | 显示全部楼层
无回帖,不论坛,这才是人道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-19 16:40:44 | 显示全部楼层
我是来领鱼币的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-21 15:37:48 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-7 17:10:28 | 显示全部楼层
顿时释然饿了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-10 13:11:40 | 显示全部楼层
:smile
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表