标题:连表问题
取消只看楼主
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
 问题点数:0 回复次数:7 
连表问题

# include<iostream.h>

struct S
{
int Date;
S *next;
};

S* Head;

S *create()
{
S* PS;
S* PEnd;
PS=new S;
cin>>PS->Date;
Head=NULL;
PEnd=PS;

while(PS->Date!=0)
{
if(Head==NULL)
Head=PS;
else
PEnd->next=PS;//连接
PEnd=PS; //后挪;
PS=new S;//再分配
cin>>PS->Date;
}
PEnd->next=NULL;
delete PS;
return Head;
}

S* ShowList(S*head)
{
cout<<"shuchu\n";
while(head)
{
cout<<head->Date<<endl;
head=head->next;
}
return head ;
}


S* Shan(S* head, int DaiShanShu) //删除连表
{
S* P;
if(!head)
{
cout<<"不能删除,因为连表为0:\n";
}
if(head->Date==DaiShanShu)
{
P= head;
head=head->next;
delete P ;
}
for( S* G=head;G->next;G=G->next)
{ //另外G->next这个代表什么意思,我第一次看到这中形式
if(G->next->Date==DaiShanShu)
{
P=G->next;
G=G->next->next;
delete P;
cout<<DaiShanShu<<"被删除:\n";
}
}
return head ;
}


void main()
{
S* M;
S* N;
M=create();
ShowList(M);
N=Shan(M,100);
ShowList(N);
return ;
}


那里出了问题,请大家帮我修改以下,谢谢

搜索更多相关主题的帖子: next del include create 
2006-10-17 21:22
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
得分:0 
你好:
以下是引用summersun在2006-10-17 22:56:54的发言:

for( S* G=head;G->next;G=G->next)
{ //这里的G->next表示判断G->next是否为真,即不等于NULL
if(G->next->Date==DaiShanShu)
{
P=G->next;
// G=G->next->next; 程序错误
G->next=G->next->next; //应改成这样才对
delete P;
cout<<DaiShanShu<<"被删除:\n";
}

我按照你的改正了,但是结果仍然出乎意料?你能再帮帮么?

2006-10-18 16:29
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
得分:0 
以下是引用fukl在2006-10-18 12:46:43的发言:
"->"是类指针的访问符,for(S* G=head;G->next!=NULL;G=G->next)这里定义G为一个类指针,G->next就是访问类的成员next

那么这句话能换个更容易理解的写法么,

2006-10-18 16:30
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
得分:0 

程序我该写好了!能正确运行出我要的结果拉!
但遗憾的是,还有一句警告:
如何再改写才能没有警告呢?请大家帮忙呀!

# include<iostream.h>

struct S
{
int Date;
S *next;
};

S* Head;

S *create()
{
S* PS;
S* PEnd;
PS=new S;
cin>>PS->Date;
Head=NULL;
PEnd=PS;

while(PS->Date!=0)
{
if(Head==NULL)
Head=PS;
else
PEnd->next=PS;//连接
PEnd=PS; //后挪;
PS=new S;//再分配
cin>>PS->Date;
}
PEnd->next=NULL;
delete PS;
return Head;
}

S* ShowList(S*head)
{
cout<<"shuchu\n";
while(head)
{
cout<<head->Date<<endl;
head=head->next;
}
return head ;
}


S* Shan(S* head, int DaiShanShu) //删除连表
{
S* P;
if(!head)
{
cout<<"不能删除,因为连表为0:\n";
}
if(head->Date==DaiShanShu)
{
P= head;
head=head->next;
delete P ;
}
for( S* G=head;G->next;G=G->next)
{
if(G->next->Date==DaiShanShu)
{
P=G->next;
G->next=G->next->next;
delete P;
return head ;//正确的返回在这里!
}
// return head 在这里返回则不能删除;
}
cout<<DaiShanShu<<"被删除:\n";
}

void main()
{
S* M;
S* N;
cout<<"创建连表:\n";
M=create();
cout<<"展示连表:\n";
ShowList(M);
cout<<"调用删除:\n";
N=Shan(M,100);
cout<<"展示删除以后的连表:\n";
ShowList(N);
return ;
}

程序我该写好了!能正确运行出我要的结果拉!
但遗憾的是,还有一句警告:
如何再改写才能没有警告呢?请大家帮忙呀!

E:\C++分支\混合\...... : warning C4715: 'Shan' : not all control paths return a value

2006-10-18 17:12
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
得分:0 
以下是引用song4在2006-10-18 17:12:05的发言:
for(S* G=head;G->next!=NULL;G=G->next)

谢谢你拉!

2006-10-18 17:13
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
得分:0 

我不大明白

你能在我的程序上修该一下么,或者再程序上标注一下么?
或许那样我就能理解拉!

[此贴子已经被作者于2006-10-18 17:21:50编辑过]

2006-10-18 17:18
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
得分:0 
谢谢拉!你真 厉害!
2006-10-18 17:27
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
得分:0 

正确拉!

[此贴子已经被作者于2006-10-18 17:44:30编辑过]

2006-10-18 17:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-97016-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.851463 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved