当前位置: 代码迷 >> C语言 >> [求助] 单链表连接问题
  详细解决方案

[求助] 单链表连接问题

热度:335   发布时间:2006-10-27 13:11:35.0
[求助] 单链表连接问题

编写函数实现单链表类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;
}

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

搜索更多相关的解决方案: 单链  

----------------解决方案--------------------------------------------------------
都到这个份上了剩下的还不简单吗 ??

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

last.next = headB;
}


----------------解决方案--------------------------------------------------------
c++暂时不会
----------------解决方案--------------------------------------------------------
啊,谢谢了。
我还想问个问题
如何简单修改程序把单链表改成双向循环链表啊
我不会改,重新做一个链表还可以做到
----------------解决方案--------------------------------------------------------
谢谢
我学得不认真,以后好好学
----------------解决方案--------------------------------------------------------
以下是引用yangzhks在2006-10-27 18:50:22的发言:
啊,谢谢了。
我还想问个问题
如何简单修改程序把单链表改成双向循环链表啊
我不会改,重新做一个链表还可以做到

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

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


----------------解决方案--------------------------------------------------------
你还在吗,帮帮我,定位和把pos结点设为当前结点,有什么不一样吗
----------------解决方案--------------------------------------------------------
还是有问题,不能连接在一起。该怎么做呢。编译没有问题,可是运行不出来
----------------解决方案--------------------------------------------------------
  相关解决方案