标题:c++线形链表的问题
只看楼主
绝对冰点
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-9-13
 问题点数:0 回复次数:9 
c++线形链表的问题
我初学数据结构,线形链表不甚了解,老师布置的题目,急求正解。
原题目是:两个带头结点的链表a,b。从a中删除从第i个元素起length个元素,并插入到b中第j个元素之前。

以下是我自己写的,用vs2005调试不成功,望高手修改过告诉我,谢谢。

#include <iostream>
using namespace std;
//结构体
struct Node
{
int data;
Node *next;
};
//创建链表a
Node *ahead=NULL;
Node *atail=NULL;
Node *pnewa;
for(int a=1;a<10;a++)
{
pnewa=new Node;
if(pnewa=null)
{
cout << "memory insufficient!"<<endl;
return null;
}
pnewa->data=a;
pnewa->next=null;
if(atail=null)
ahead =pnewa;
else
atail->next=pnewa;
btail=pnewa;
}
//创建链表b
Node *bhead=NULL;
Node *btail=NULL;
Node *pnewb;
int b;
for(b=1;b<15;b++)
{
pnewb=new Node;
if(pnewb=null)
{
cout << "memory insufficient!"<<endl;
return null;
}
pnewb->data=b;
pnewb->next=null;
if(btail=null)
bhead =pnewb;
else
btail->next=pnewb;
btail=pnewb;
}


void main()
{
int i,j,length;
int a,b;
cout <<"intput i,j,length"<<endl;
cin>>i>>j>>length;


//查找a的第i-1个元素
int *pa,ma;
pa=ahead;
while(ma<i-1&&!pa)
{
pa=pa->next;
ma++;
}
//查找第i个后length个元素
if(pa->next!=null)
{
int *q,n;
q=pa->next;
while(n<length&&!q)
{
q=q->next;
n++;
}
}
else
return null;

//查找b中第j个元素
int *pb=bhead;
int mb;
while(mb<j-1&&!pb)
{
pb=pb->next;
mb++;
}
if(!pb)
{
q->next=pb->next;
pb->next=pa->next;
}


Node *pNode=bhead;
while(pNode!=null)
{
cout <<pNode->data<<'\t';
pNode =pNode->next;
}
}
搜索更多相关主题的帖子: 链表 线形 Node int 元素 
2007-10-23 19:57
yanyananlin
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-10-21
得分:0 
太长了吧?
2007-10-23 21:16
xskowscut
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-10-13
得分:0 

阁下创建链表的时候怎么又不在main函数里面创建的呢?这怎么可能创建成功啊。。。都没有函数入口,怎么return?应该在main里面创建。

你的main函数是void ,请不要return null.

main函数里面的while循环条件都有问题,要实现p = p->next, 则p != NULL。

插入时注意找到a的第i元素后,应该用一个临时指针1指向此元素,然后用另一个临时指针2保存b的第j个元素,在b的第j-1个元素后面插入临时指针1,然后a的tail指向临时指针2,最后把a的第i-1个元素的next赋空,并把tail指回此元素。完成。

楼主应该加强一下训练哦!C++中是NULL,不是null.那是java里面的。


希望能够跟大家学习!交流编程经验!
2007-10-23 22:02
xskowscut
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-10-13
得分:0 

ps:由于明天计算机网络考试,所以不能帮你修改程序了,但是按照上面的方法应该很好做的。加油哦!


希望能够跟大家学习!交流编程经验!
2007-10-23 22:25
neufcl
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-23
得分:0 
注意=与==的区别。
if后面的括号里不可能是=吧,应该是==

学好C++
2007-10-24 09:34
xskowscut
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-10-13
得分:0 
5楼同志说的对,忽略了。呵呵

希望能够跟大家学习!交流编程经验!
2007-10-24 17:46
绝对冰点
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-9-13
得分:0 
以下是引用xskowscut在2007-10-23 22:02:51的发言:

阁下创建链表的时候怎么又不在main函数里面创建的呢?这怎么可能创建成功啊。。。都没有函数入口,怎么return?应该在main里面创建。

你的main函数是void ,请不要return null.

main函数里面的while循环条件都有问题,要实现p = p->next, 则p != NULL。

插入时注意找到a的第i元素后,应该用一个临时指针1指向此元素,然后用另一个临时指针2保存b的第j个元素,在b的第j-1个元素后面插入临时指针1,然后a的tail指向临时指针2,最后把a的第i-1个元素的next赋空,并把tail指回此元素。完成。

楼主应该加强一下训练哦!C++中是NULL,不是null.那是java里面的。


c++中的是NULL,从来也没注意到,谢谢给的意见。
我照你的改过,再试试

2007-10-25 19:54
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
参照一下数据结构区我写的链表帖.
//创建链表a
Node *ahead=NULL;
Node *atail=NULL;
Node *pnewa;
for(int a=1;a<10;a++)
{
pnewa=new Node;
if(pnewa=null)
{
cout << "memory insufficient!"<<endl;
return null;
}
pnewa->data=a;
pnewa->next=null;
if(atail=null)
ahead =pnewa;
else
atail->next=pnewa;
btail=pnewa;
}
//创建链表b
Node *bhead=NULL;
Node *btail=NULL;
Node *pnewb;
int b;
for(b=1;b<15;b++)
{
pnewb=new Node;
if(pnewb=null)
{
cout << "memory insufficient!"<<endl;
return null;
}
pnewb->data=b;
pnewb->next=null;
if(btail=null)
bhead =pnewb;
else
btail->next=pnewb;
btail=pnewb;
}
整个这一段函数不像函数,怎么可以这样弄.

倚天照海花无数,流水高山心自知。
2007-10-25 20:38
xskowscut
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-10-13
得分:0 

修改后的代码,楼主注意查收:
#include <iostream>
using namespace std;
//结构体
struct Node
{
int data;
Node *next;
};

void main()
{
//创建链表a
Node *ahead=NULL;
Node *atail=NULL;
Node *pnewa;
for(int a=1;a<10;a++)
{
pnewa=new Node;
if(pnewa==NULL) //if里面的判断通常只会是==,记住,很容易出错但却难以调试
{
cout << "memory insufficient!"<<endl;
return;
}
pnewa->data=a;
pnewa->next=NULL;
if(atail==NULL)
ahead =pnewa;
else
atail->next=pnewa;
atail=pnewa;
}
//创建链表b
Node *bhead=NULL;
Node *btail=NULL;
Node *pnewb;
int b;
for(b=1;b<15;b++)
{
pnewb=new Node;
if(pnewb==NULL)
{
cout << "memory insufficient!"<<endl;
return;
}
pnewb->data=b;
pnewb->next=NULL;
if(btail==NULL)
bhead =pnewb;
else
btail->next=pnewb;
btail=pnewb;
}

int i,j,length;
cout <<"input i,j,length:"<<endl;
cin>>i>>j>>length;

//查找a的第i-1个元素
Node *pa;
int ma = 1;
pa=ahead;
while(ma<i-1 && pa)
{
pa=pa->next;
ma++;
}
if(!pa) //检查越界,如果没有此句,下面的判断中pa如果为空就会出错了
{
cout << "Null pointer!" << endl;
return;
}
//查找第i个后length个元素
Node *q = pa->next, *s = pa->next;
if(pa->next!=NULL)
{
int n = 1;
while(n<length && q)
{
q=q->next;
n++;
}
atail = q->next; //修改atail指针
pa->next = atail; //已经删除了a中length个元素
}
else
{
cout << "Can not satisfy your request!" << endl;
return;
}
//查找b中第j个元素
Node *pb=bhead;
int mb = 1;
while(mb<j-1 && pb)
{
pb=pb->next;
mb++;
}
if(!pb) //表尾插入
{
btail->next = s;
btail = q;
}
else
{
Node *t = pb->next; //t指向第j个元素
pb->next = s;
q->next = t;
if(!t) btail = q;
}
Node *pNode=ahead; //遍历链表a
cout << "List a's elements:\n";
while(pNode!=NULL)
{
cout <<pNode->data<<'\t';
pNode =pNode->next;
}
pNode = bhead; //遍历链表b
cout << "\n\nThen list b's elements:\n";
while(pNode != NULL)
{
cout << pNode->data << '\t';
pNode = pNode->next;
}
cout << "\n\nPress Enter to quit...";
cin.get();
cin.get();
}
水平有限,多多包涵。


希望能够跟大家学习!交流编程经验!
2007-10-26 00:16
ytmGring
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-5-27
得分:0 
唉,这么多人帮你写了偶就只有看的份了~

欢迎参观http://blog..cn/ytmGring
2007-10-26 00:50



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




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

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