求教一个问题,搞了半天不定.

hkk333 2007-11-23 10:28:41
钱能C++程序设计教程 练习10.6:
建立一个10结点的单向链表,每个结点包括:学号,姓名,性别,年龄.对其进行排序,采用插入排序法,按学号从小到大排列.

我鼓搞半天不定的代码如下:
(运行是个死循环...为了输入方便点,只要求输入学号,输出也只输出学号.感觉只有排序函数myisort有错误,没办法了)

#include <iostream.h>
#include <stdlib.h>

const int size=10;

struct Lnode
{
int number;
char name[20];
char sex[10]; //male and female
int age;
Lnode* next;
};


Lnode* create() ;
void print(Lnode* head);
void myisort(Lnode*& head,const int size);
int Listlen(Lnode* head);


void main()
{
int len;
Lnode* head=create();

len=Listlen(head);
cout <<"the length of the list is: "
<<len
<<endl <<endl;
print(head);

myisort(head,size);
print(head);

}

Lnode* create()
{
Lnode* head=NULL;
Lnode* pEnd;
Lnode* pS;

pS=new Lnode;
pEnd=pS;

cout <<"please input a number: \n";
cin >>pS->number;
cout <<endl<<endl;

while(pS->number) //looping, until pS->number is zero
{
if(head == NULL)
head=pS;

pEnd->next=pS;
pEnd=pEnd->next;

pS=new Lnode;

cout <<"please input a number: \n";
cin >>pS->number;
cout <<endl<<endl;
}

pEnd->next=NULL;

return head;
}

void print(Lnode* head)
{
Lnode* tmp=head;

if (head == NULL)
cerr <<"\nerror! the is a empty list! \n\n";

while(head)
{
cout <<head->number <<",";

head=head->next;
}

head=tmp;

cout <<endl;
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void myisort(Lnode*& head,const int size)
{
Lnode* Guard_inserter;
Lnode* inserter;
Lnode* Guard_index;
Lnode* index;

int n;

for(int i=size;i>1;i--)
{
n=i-1;
Guard_inserter = inserter = Guard_index = index = head;

cout <<n <<endl;

while(n>0) //定位本轮比较的指针
{
if(i!=2)
{
Guard_index=index;
index=index->next;

Guard_inserter=inserter;
inserter=Guard_index;

n--;
}

else
{
Guard_index=index;
index=index->next;

n--;
}
}

cout <<n <<endl;

while(index && inserter->number < index->number) //查找插入点
{

Guard_index=index;
index=index->next;
}

if(i!=2) //插入:inserter本身在非链首和链首
{

Guard_inserter=inserter->next; //inserter 脱链

inserter->next=Guard_index->next;

Guard_index->next=inserter;

}

else
{
if(Guard_index != inserter)
{

head = inserter->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}

else
{
head = inserter->next;

inserter->next = index->next;

head->next = inserter;
}
}


}//end for
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>...

int Listlen(Lnode* head)
{
int i=0;
Lnode* tmp=head;

while(head)
{
i++;
head=head->next;
}

head=tmp;
return i;
}

...全文
209 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hkk333 2007-11-24
  • 打赏
  • 举报
回复
我自己搞定了,我现在做这本书的习题不想有一个做不出来的,因为现在看着知识点都没有什么含糊的地方了,所以也不希望把习题全做完的想法无法达成.(发现例子中都有不少错误,大汗)

myisort函数改了一下.当不需要移动的时候就直接执行下一轮比较,即目标位置就在下一个位置时直接continue;


代码如下:


void myisort(Lnode*& head,const int size)
{
Lnode* Guard_inserter;
Lnode* inserter;
Lnode* Guard_index;
Lnode* index;


int n;

for(int i=1;i<size;i++)
{
n=size-i;

Guard_inserter = inserter = Guard_index = index = head;
index=index-> next;

while(--n) //定位本轮比较的指针
{
Guard_index=index;
index=index->next;

Guard_inserter=inserter;
inserter=inserter->next;
}


while(index && index->number < inserter->number) //查找插入点
{
Guard_index=index;
index=index->next;
}

if(inserter->next == index) //不需要移动
{
print(head);
continue;
}

if(i!=9) //插入:inserter本身在非链首
{
Guard_inserter->next = inserter->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}

if(i==9) //插入:inserter本身在非链首
{

head = head->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}

print(head);

}//end for
}



PcrazyC 2007-11-23
  • 打赏
  • 举报
回复
myisort这个函数是干嘛用的,是排序吗?
hkk333 2007-11-23
  • 打赏
  • 举报
回复
我不是故意发同样内容的...再试试





#include <iostream.h>
#include <stdlib.h>

const int size=10;

struct Lnode
{
int number;
char name[20];
char sex[10]; //male and female
int age;
Lnode* next;
};


Lnode* create() ;
void print(Lnode* head);
void myisort(Lnode*& head,const int size);
int Listlen(Lnode* head);


void main()
{
int len;
Lnode* head=create();

len=Listlen(head);
cout <<"the length of the list is: " <<len <<endl;
print(head);

myisort(head,size);
print(head);

}

Lnode* create()
{
Lnode* head=NULL;
Lnode* pEnd;
Lnode* pS;

pS=new Lnode;
pEnd=pS;

cout <<"please input a number: \n";
cin >>pS->number;

cout <<endl<<endl;

while(pS->number) //looping, until pS->number is zero
{
if(head == NULL)
head=pS;

pEnd->next=pS;
pEnd=pEnd->next;

pS=new Lnode;

cout <<"please input a number: \n";
cin >>pS->number;

cout <<endl<<endl;
}

pEnd->next=NULL;

return head;
}

void print(Lnode* head)
{
Lnode* tmp=head;

if (head == NULL)
cerr <<"\nerror! the is a empty list! \n\n";

while(head)
{
cout <<head->number <<",";

head=head->next;
}

head=tmp;

cout <<endl;
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void myisort(Lnode*& head,const int size)
{
Lnode* Guard_inserter;
Lnode* inserter;
Lnode* Guard_index;
Lnode* index;

int n;

for(int i=size;i>1;i--)
{
n=i-1;
Guard_inserter = inserter = Guard_index = index = head;

cout <<n <<endl;

while(n>0) //定位本轮比较的指针
{
if(i!=2)
{
Guard_index=index;
index=index->next;

Guard_inserter=inserter;
inserter=Guard_index;

n--;
}

else
{
Guard_index=index;
index=index->next;

n--;
}
}

cout <<n <<endl;


while(index && inserter->number < index->number) //查找插入点
{

Guard_index=index;
index=index->next;
}

if(i!=2) //插入:inserter本身在非链首和链首
{

Guard_inserter=inserter->next; //inserter 脱链

inserter->next=Guard_index->next;

Guard_index->next=inserter;

}

else
{
if(Guard_index != inserter)
{

head = inserter->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}

else
{
head = inserter->next;

inserter->next = index->next;

head->next = inserter;
}
}


}//end for
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>...

int Listlen(Lnode* head)
{
int i=0;
Lnode* tmp=head;

while(head)
{
i++;
head=head->next;
}

head=tmp;
return i;
}

hkk333 2007-11-23
  • 打赏
  • 举报
回复
格式全乱了,晕,再发看看

#include <iostream.h>
#include <stdlib.h>

const int size=10;

struct Lnode
{
int number;
char name[20];
char sex[10]; //male and female
int age;
Lnode* next;
};


Lnode* create() ;
void print(Lnode* head);
void myisort(Lnode*& head,const int size);
int Listlen(Lnode* head);


void main()
{
int len;
Lnode* head=create();

len=Listlen(head);
cout <<"the length of the list is: " <<len <<endl;
print(head);

myisort(head,size);
print(head);

}

Lnode* create()
{
Lnode* head=NULL;
Lnode* pEnd;
Lnode* pS;

pS=new Lnode;
pEnd=pS;

cout <<"please input a number: \n";
cin >>pS->number;

cout <<endl<<endl;

while(pS->number) //looping, until pS->number is zero
{
if(head == NULL)
head=pS;

pEnd->next=pS;
pEnd=pEnd->next;

pS=new Lnode;

cout <<"please input a number: \n";
cin >>pS->number;

cout <<endl<<endl;
}

pEnd->next=NULL;

return head;
}

void print(Lnode* head)
{
Lnode* tmp=head;

if (head == NULL)
cerr <<"\nerror! the is a empty list! \n\n";

while(head)
{
cout <<head->number <<",";

head=head->next;
}

head=tmp;

cout <<endl;
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void myisort(Lnode*& head,const int size)
{
Lnode* Guard_inserter;
Lnode* inserter;
Lnode* Guard_index;
Lnode* index;

int n;

for(int i=size;i>1;i--)
{
n=i-1;
Guard_inserter = inserter = Guard_index = index = head;

cout <<n <<endl;

while(n>0) //定位本轮比较的指针
{
if(i!=2)
{
Guard_index=index;
index=index->next;

Guard_inserter=inserter;
inserter=Guard_index;

n--;
}

else
{
Guard_index=index;
index=index->next;

n--;
}
}

cout <<n <<endl;


while(index && inserter->number < index->number) //查找插入点
{

Guard_index=index;
index=index->next;
}

if(i!=2) //插入:inserter本身在非链首和链首
{

Guard_inserter=inserter->next; //inserter 脱链

inserter->next=Guard_index->next;

Guard_index->next=inserter;

}

else
{
if(Guard_index != inserter)
{

head = inserter->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}

else
{
head = inserter->next;

inserter->next = index->next;

head->next = inserter;
}
}


}//end for
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>...

int Listlen(Lnode* head)
{
int i=0;
Lnode* tmp=head;

while(head)
{
i++;
head=head->next;
}

head=tmp;
return i;
}

hkk333 2007-11-23
  • 打赏
  • 举报
回复
上面的排序代码并没有按照题意排好序啊. 而且输出时只有9个节点了,丢失了一个?
lovelyparrot 2007-11-23
  • 打赏
  • 举报
回复
你的index和inserter已经减到0了,所以没有next了,再index->next或inserter->next就出错了,所以只需要加if()判断它们为不为0就可以了,正确代码如下,已经调试通过

#include <iostream.h>
#include <stdlib.h>

const int size=10;

struct Lnode
{
int number;
char name[20];
char sex[10]; //male and female
int age;
Lnode* next;
};


Lnode* create() ;
void print(Lnode* head);
void myisort(Lnode*& head,const int size);
int Listlen(Lnode* head);




Lnode* create()
{
Lnode* head=NULL;
Lnode* pEnd;
Lnode* pS;

pS=new Lnode;
pEnd=pS;

cout<<"please input a number: \n";
cin>>pS-> number;

cout<<endl<<endl;

while(pS-> number) //looping, until pS-> number is zero
{
if(head == NULL)
head=pS;

pEnd-> next=pS;
pEnd=pEnd-> next;

pS=new Lnode;

cout<<"please input a number: \n";
cin>> pS-> number;

cout<<endl<<endl;
}

pEnd-> next=NULL;

return head;
}

void print(Lnode* head)
{
Lnode* tmp=head;

if (head == NULL)
cerr<<"\nerror! the is a empty list! \n\n";

while(head)
{
cout<<head-> number<<",";

head=head-> next;
}

head=tmp;

cout<<endl;
}

//> > > > > > > > > > > > > > > > > > > > > > > > > > > > >

void myisort(Lnode*& head,const int size)
{
Lnode* Guard_inserter;
Lnode* inserter;
Lnode* Guard_index;
Lnode* index;


int n;

for(int i=1;i<size;i++)
{
n=size-i;

Guard_inserter = inserter = Guard_index = index = head;
while(--n) //定位本轮比较的指针
{
Guard_index=index;
if(index != 0)
{
index=index->next;
}
else
{
break;
}

Guard_inserter=inserter;
inserter=inserter->next;
}

while(index && index->number < inserter->number) //查找插入点
{

Guard_index=index;
index=index->next;
}

if(i!=9) //插入:inserter本身在非链首
{
if(inserter != 0)
{
Guard_inserter->next = inserter->next;
}
else
{
break;
}

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}

if(i==9) //插入:inserter本身在非链首
{

head = head->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}


}//end for


}

//> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ...

int Listlen(Lnode* head)
{
int i=0;
Lnode* tmp=head;

while(head)
{
i++;
head=head-> next;
}

head=tmp;
return i;
}

void main()
{
int len;
Lnode* head=create();

len=Listlen(head);
cout<<"the length of the list is: "<<len<<endl;
print(head);

myisort(head,size);
print(head);

}


你的index和inserter已经减到0了,所以没有next了,再index->next或inserter->next就出错了,所以只需要加if()判断它们为不为0就可以了,正确代码如下,已经调试通过
hkk333 2007-11-23
  • 打赏
  • 举报
回复
上面代码中,我自己的草稿上,有一句忘了加上去:

Guard_inserter = inserter = Guard_index = index = head;
index=index->next; //加上这句..

不过照样没用.无奈了.
hkk333 2007-11-23
  • 打赏
  • 举报
回复
就是按照题意,用来按插入排序法排序用的( 一共 size-1 loops)
( low
|
|
V
high )

我想的可能插入排序形式:

head -> 0 // if ( (inserter->number > index->number) && (index->next != NULL) )
0 index=index->next
0
0
0
0
0
0
0 <- inserter (first loop)
0 <- index
|
NULL

head -> 0
0
0
0
0
0
0
0 <- inserter (second loop)
0 <- index
0
|
NULL

:
:
:

head -> 0 <- inserter (last loop)
0 <- index
0
0
0
0
0
0
0
0
|
NULL
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

这是我刚才改了一下的排序函数,还是有错误,不过应该比前面的简洁了点,大家帮忙看看有什么问题;


void myisort(Lnode*& head,const int size)
{
Lnode* Guard_inserter;
Lnode* inserter;
Lnode* Guard_index;
Lnode* index;


int n;

for(int i=1;i<size;i++)
{
n=size-i;

Guard_inserter = inserter = Guard_index = index = head;
while(--n) //定位本轮比较的指针
{
Guard_index=index;
index=index->next;

Guard_inserter=inserter;
inserter=inserter->next;
}

while(index && index->number < inserter->number) //查找插入点
{

Guard_index=index;
index=index->next;
}

if(i!=9) //插入:inserter本身在非链首
{
Guard_inserter->next = inserter->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}

if(i==9) //插入:inserter本身在非链首
{

head = head->next;

inserter->next = Guard_index->next;

Guard_index->next = inserter;
}


}//end for
}

65,185

社区成员

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

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