| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1038 人关注过本帖
标题:[求助] 单链表连接问题
只看楼主 加入收藏
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
结帖率:28.57%
收藏
 问题点数:0 回复次数:7 
[求助] 单链表连接问题

编写函数实现单链表类LinList的对象B连接到单链表类LinList的对象A的尾部:Void Concatenate(LinList& A, LinList& B)。
能告诉我方法思路吗
#include<iostream.h>
#include<stdio.h>
template<class T>class LinList; //前视定义,否则,无法定义友元
template<class T>class ListNode
{
friend class LinList<T>; //定义友元
private:
ListNode<T> *next; //指向下一个结点的指针
public:
T data;
ListNode(ListNode<T> *ptrNext = NULL); //构造函数,用于构造头结点
ListNode(const T& item,ListNode<T> *ptrNext = NULL);//构造函数,非头结点
~ListNode(){}; //析构函数

};

template<class T>
ListNode<T>::ListNode(ListNode<T> *ptrNext):next(ptrNext)
{}
template<class T>
ListNode<T>::ListNode(const T &item,ListNode<T> *ptrNext)
{
data=item;
next=ptrNext;
};


#include "ListNode.h"
template<class T>
class LinList
{
private:
ListNode<T> *head; //指向头结点的指针
int size; //单链表的元素个数
ListNode<T> *currPtr; //当前结点
public:
LinList(void); //构造函数
~LinList(void); //析构函数

int ListSize(void) const; //返回链表的元素个数
int ListEmpty(void) const; //判断链表是否为空
ListNode<T> *Index(int pos); //定位
void Insert(const T& item,int pos); //插入
T Delete(int pos); //删除
T GetData(int pos); //取元素
void ClearList(void); //清空链表
//遍历单链表函数
ListNode<T> *Reset(int pos=0); //把第pos个结点设置为当前结点currPtr
ListNode<T> *Next(void); //currPtr指向下一个结点
int EndOfList(void) const; //currPtr是否指在链表尾

};
template<class T>
LinList<T>::LinList() //构造函数
{
head=new ListNode<T>();
size=0;
}

template<class T>
LinList<T>::~LinList(void) //析构函数
{
ClearList();
delete head;
}

template<class T>
int LinList<T>::ListSize(void) const //返回链表的个数
{
return size;
}

template<class T>
int LinList<T>::ListEmpty(void) const //判断是否为空
{
if(size<=0)return 1;
else return 0;
}

template<class T>
ListNode<T> *LinList<T>::Index(int pos) //定位,返回指向第pos个结点的指针
{
if(pos<-1||pos>size)
{
cout<<"参数pos越界出错!"<<endl;
exit(0);
}
if(pos==-1)return head;
ListNode<T> *p=head->next;
int i=0;
while(p!=NULL&&i<pos)
{
p=p->next;
i++;
}
return p;
}

template<class T>
void LinList<T>::Insert(const T& item,int pos)
//在pos个结点之前插入一个data域为item的新结点
{
if(pos<0||pos>size)
{
cout<<"参数pos越界出错!!!"<<endl;
exit(0);
}
ListNode<T> *p=Index(pos-1);
ListNode<T> *newNode=new ListNode<T>(item,p->next);
p->next=newNode;
size++;
}

template<class T>
T LinList<T>::Delete(int pos) //删除第pos个结点,并返回被删除结点的data
{
if(pos<0||pos>size-1)
{
cout<<"参数pos越界出错!!"<<endl;
exit(0);
}
ListNode<T> *q,*p=Index(pos-1);
q=p->next;
p->next=p->next->next; //第pos个接点脱节
T data=q->data; //保存
delete q; //释放空间
size--;
return data;

}

template<class T>
T LinList<T>::GetData(int pos)
{
if(pos<0||pos>size-1)
{
cout<<"参数pos越界出错!!"<<endl;
exit(0);
}
ListNode<T> *p=Index(pos);
return p->data;
}

template<class T>
void LinList<T>::ClearList(void) //清空表为初始化状态
{
ListNode<T> *p,*p1;
p=head->next;
while(p!=NULL)
{
p1=p;
p=p->next;
delete p1;
}
size=0;
}

template<class T>
ListNode<T> *LinList<T>::Reset(int pos) //把第pos个结点设置为当前结点currPtr
{
if(head==NULL)return NULL;
if(pos<-1||pos>=size)
{
cout<<"参数出错!"<<endl;
exit(0);
}
if(pos==-1) return head;
if(pos==0) currPtr=head->next;
else
{
currPtr=head->next;
ListNode<T> prevPtr=head;
for(int i=0;i<pos;i++)
{
prevPtr=currPtr;
currPtr=currPtr->next;
}
}
return currPtr;

}

template<class T>
ListNode<T> *LinList<T>::Next(void) //currPtr指向下一个结点
{
if(currPtr !=NULL) currPtr=currPtr->next;
return currPtr;
}

template<class T>
int LinList<T>::EndOfList(void) const //currPtr是否指在链表尾
{
if(currPtr==NULL)return 1;
else return 0;
}

怎么在主函数中编该函数呢,我想了很久了,谢谢各位

搜索更多相关主题的帖子: 单链 
2006-10-27 13:11
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
都到这个份上了剩下的还不简单吗 ??

void Concatenate(LinList& A, LinList& B)//将该函数声明为ListNode的友元函数
{
ListNode headB,lastA;
lastA:A的尾节点 headB:B的头节点 怎么获得的?嘿嘿,,就自己想吧?

last.next = headB;
}


天行健,君子以自强不息!!QQ:68660681
2006-10-27 18:37
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
c++暂时不会

谁有强殖装甲第二部,可以Q我460054868
2006-10-27 18:39
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
收藏
得分:0 
啊,谢谢了。
我还想问个问题
如何简单修改程序把单链表改成双向循环链表啊
我不会改,重新做一个链表还可以做到
2006-10-27 18:50
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
收藏
得分:0 
谢谢
我学得不认真,以后好好学
2006-10-27 18:56
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
以下是引用yangzhks在2006-10-27 18:50:22的发言:
啊,谢谢了。
我还想问个问题
如何简单修改程序把单链表改成双向循环链表啊
我不会改,重新做一个链表还可以做到

双向:在ListNode中添加一个ListNode<T> *last;指向上一个节点
在LinList中添加一个ListNode GetLast();返回上一个节点

循环:LinList的头节点为HEAD,尾节点为END,,
然后END.next = HEAD;HEAD.last = END;


天行健,君子以自强不息!!QQ:68660681
2006-10-27 19:23
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
收藏
得分:0 
你还在吗,帮帮我,定位和把pos结点设为当前结点,有什么不一样吗
2006-10-27 20:50
yangzhks
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1135
专家分:13
注 册:2006-10-27
收藏
得分:0 
还是有问题,不能连接在一起。该怎么做呢。编译没有问题,可是运行不出来
2006-10-27 21:51
快速回复:[求助] 单链表连接问题
数据加载中...
 
   



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

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