| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 765 人关注过本帖
标题:[求助]C++实现链表中的一个问题
只看楼主 加入收藏
chzg99
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-2-28
收藏
 问题点数:0 回复次数:3 
[求助]C++实现链表中的一个问题

我现在教数据结构课程,我是用C++来描述的。对单链表的定义与实现都是通过类的方式完成的,最近写了一个将两个链表合并成为一个新的链表的函数,通过主函数调用时编译(c++Builder5.0)老是通不过。请教高手,这个问题可能需要C++非常有经验的高手才能解决。
以下是结点的定义,还有链表的定义,存成了头文件:linklist.h
#include<iostream.h>
#include<conio.h>


template <class Type> class LinkList;


template <class Type>
class LNode{
public:
friend class LinkList<Type> ;
friend void MergeList(LinkList<Type> &,LinkList<Type> &,LinkList<Type> &);


LNode(){
next=NULL;
}
LNode(const Type&e,LNode<Type>* l=NULL){
data=e;
next=l;
}

private:
Type data;
LNode<Type> *next;
};

template <class Type>

class LinkList{

public:
friend void MergeList(LinkList<Type> &,LinkList<Type> &,LinkList<Type> &);

LinkList(){
head=new LNode<Type>();
}
~LinkList();
int Length();
int Find(Type x);
bool Insert(int i,Type x);
bool Delete(int i);
bool Get(int i,Type &e);//取单链表中第i个元素的值,其值赋给e

private:
LNode<Type> *head;//单链表的头指针

} ;

template <class Type>
LinkList<Type>::~LinkList(){
LNode<Type> *p;
while(head!=NULL){
p=head;
head=head->next;
delete p;
}
}

template <class Type>
int LinkList<Type>::Length(){
LNode<Type> *p;
p=head->next;
int count=0;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}

template <class Type>
bool LinkList<Type>::Insert(int i,Type x){
LNode<Type> *p;
p=head;
int j=0;
while(p&&j<i-1){
p=p->next;
++j;
}//若指针跳出循环非空的话,指针P就指向第i-1个结点

if(!p||j>i-1)
return false;
LNode<Type> *s=new LNode<Type>();
s->data=x;
s->next=p->next;
p->next=s;
return true;
}

template <class Type>
bool LinkList<Type>::Delete(int i){
LNode<Type> *p,*q;
p=head;
int j=0;
while(p->next&&j<i-1){
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return false;
q=p->next;
p->next=q->next;
delete q;
return true;
}

template <class Type>
bool LinkList<Type>::Get(int i,Type &e){
LNode<Type> *p;
p=head->next;
int j=1;
while(p&&j<i){//指针向后查找,直到p指向第i个元素或p为空
p=p->next;
++j;
}
if(!p||j>i)
return false;
e=p->data;
return true;
}


下面是调用的主程序,还有合并链表的函数mergelist,
#include"linklist.h"

template <class Type>
void MergeList(LinkList<Type> &La,LinkList<Type>&Lb,LinkList<Type>&Lc){

LNode<Type> *pa=(La.head)->next;
LNode<Type> *pb=Lb.head->next;
LNode<Type> *pc=Lc.head;


while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}

pc->next=pa?pa:pb;

delete La->head;//释放La的头结点
delete Lb->head;//释放Lb的头结点
}


main()
{
LinkList<int> La;
LinkList<int>Lb,Lc;
int e,i;


cout<<"插入数据之后:"<<endl;
for(i =1;i<6;i++){
{bool b=La.Insert(i,i);//插入数据
if(b) cout<<"ture"<<endl;
else cout<<"false";}
}

for(i =1;i<6;i++){
{bool b=Lb.Insert(i,i+5);//插入数据
if(b) cout<<"ture"<<endl;
else cout<<"false";}
}

cout<<"线性表La的元素为:";
for(i=1;i<=La.Length();i++){
La.Get(i,e);
cout<<e<<" ";
}
cout<<endl;

cout<<"线性表Lb的元素为:";
for(i=1;i<=Lb.Length();i++){
Lb.Get(i,e);
cout<<e<<" ";
}

MergeList(La,Lb,Lc);//这句编译老是通不过
cout<<"线性表Lc的元素为:";

for(i=1;i<=Lc.Length();i++){
Lc.Get(i,e);
cout<<e<<" ";
}
getch();
}


搜索更多相关主题的帖子: 链表 
2006-03-10 08:27
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
我用VC 编译

错误: delete La->head;//释放La的头结点
delete Lb->head;//释放Lb的头结点

改为:
delete La.head;//释放La的头结点
delete Lb.head;//释放Lb的头结点

然后运行正常。

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-03-10 10:49
sunnvya
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:1094
专家分:0
注 册:2005-11-23
收藏
得分:0 

版主英明


http://www. 第二站>>>提供源码下载
2006-03-12 11:56
chzg99
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-2-28
收藏
得分:0 
版主谢谢诶。但是我是用C++builder 为什么 通不过那????
2006-03-12 15:04
快速回复:[求助]C++实现链表中的一个问题
数据加载中...
 
   



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

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