链表冒泡程序改错

stecdeng 2008-03-15 04:55:44
前段日子在论坛看到的题目 不改变链表的 VALUE值 冒泡链表
自己写了个但是执行起来有问题
写了defListNode* swaplist(defListNode* pre, defListNode* curr, defListNode* next)函数
交换链表头两链表CURR NEXT 时, PRE为NULL

第一修正该程序或者指出错误顺利执行给全分 谢谢

#include <cstdlib>
#include <iostream>

using namespace std;
class defListNode
{
public:
int value() { return _value; }
defListNode *pNext;
defListNode(int value,defListNode *Next=NULL):_value(value),pNext(Next)
{}
private:
int _value;
};

void printlist(defListNode* list)
{
int output;
while(list!=NULL)
{
output=list->value();
cout<<output<<" ";
list=list->pNext;
}
}

defListNode* swaplist(defListNode* pre, defListNode* curr, defListNode* next)
{
if(pre==NULL)
{
curr->pNext =next->pNext;//交换数据链开头两数据的情况 PRE为NULL;
next->pNext =curr;//
return next;//返回链表首指针
}
else//则为交换链表非开始两数据(curr next)的情况
{
pre->pNext =next;
curr->pNext =next->pNext;
next->pNext =curr;
return pre;//返回PRE
}
}

defListNode* SortList(defListNode *pHead)
{
bool swapsign;//链表是否进行了交换的标志
defListNode *temppre, *temp,*tempnext, *listbegin, *firstofthree;
temp=pHead;
tempnext=pHead->pNext;

do
{
swapsign=false;
if(temp->value()>tempnext->value())//如果链表开头两数据需要交换? 进行: 跳过
{
listbegin=swaplist(NULL,temp,tempnext);
swapsign=true;//交换后标志为真
}
else
{
listbegin=temp; //不需要交换 表头无变化 地址给予listbegin 指针
}
temp=listbegin->pNext;
tempnext=temp->pNext;
temppre=listbegin;











while(tempnext!=NULL)
{
if(temp->value()>tempnext->value())
{
firstofthree=swaplist(temppre,temp,tempnext);//交换TEMP TEMPNEXT位置 返回TEMPPRE地址
swapsign=true;
}
printlist(listbegin);
cout<<endl;
temppre=temppre->pNext;
temp=temppre->pNext;//
tempnext=temp->pNext;//
printlist(listbegin);
cout<<endl;
}
} while(swapsign==true);
return listbegin;

}


int main(int argc, char *argv[])
{
defListNode* ls1=new defListNode(1);
defListNode* ls9=new defListNode(9,ls1);
defListNode* ls6=new defListNode(6,ls9);
defListNode* ls4=new defListNode(4,ls6);
defListNode* ls2=new defListNode(2,ls4);
defListNode* ls7=new defListNode(7,ls2);
defListNode* ls5=new defListNode(5,ls7);
defListNode* ls3=new defListNode(3,ls5);
defListNode* ls8=new defListNode(8,ls3);
defListNode* ls0=new defListNode(0,ls8);//建造数据链0 8 3 5 7 2 4 6 9 1
printlist(ls0);
cout<<endl<<endl;
defListNode* node=SortList(ls0);
printlist(node);

system("PAUSE");
return EXIT_SUCCESS;
}

...全文
130 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
stecdeng 2008-03-16
  • 打赏
  • 举报
回复
谢谢hityct1
手头没编译器

如果前面的if语句为假,那么ELSE语句中不是将temp地址赋予listbegin 指针了么?
hityct1 2008-03-15
  • 打赏
  • 举报
回复

if(temp-> value()> tempnext-> value())//如果链表开头两数据需要交换? 进行: 跳过
{
listbegin=swaplist(NULL,temp,tempnext);
swapsign=true;//交换后标志为真
}
else
{
listbegin=temp; //不需要交换 表头无变化 地址给予listbegin 指针
}
temp=listbegin-> pNext; //如果前面的if语句为假,listbegin指向未知
tempnext=temp-> pNext;
temppre=listbegin;

stecdeng 2008-03-15
  • 打赏
  • 举报
回复
有论坛中这个问题得来的程序:

要求 1. 只能使用O(1)的空间
2. 不能改变_value的值

/
C/C++ code
/链表节点的结构:
struct ListNode
{
int value() { return _value; }
ListNode *pNext;
private:
int _value;
};

ListNode* SortList(ListNode *pHead)
{
//请完成此算法
}



请注意 我需要对顶楼的修改而不是这个问题的解答

谢谢
  • 打赏
  • 举报
回复
链表冒泡排序??怎么那么长?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧