用模板设计一个链表类Tlist,实现链表节点的插入,删除,输出功能。

玩酷酷 2012-05-29 08:14:19
list.h
template<class T>
struct Node
{
T Date;
Node* next;
};
template<class T>
class Tlist
{
private:
Node<T>* head;
public:
Tlist(){head=NULL;}
void deletelist(T Date);
void insertlist(T aDate,T bDate);
void outputlist();
};
list.cpp
#include<iostream>
using namespace std;
#include"list.h"
template<class T>
void Tlist<T>::insertlist(T aDate,T bDate)//在节点a之前插入节点b
{
Node<T>*p,*q,*s; //p指向节点a,q指向节点a_k,s指向节点b
s=(Node<T>*)new(Node<T>); //动态分配新节点
s->Date=bDate; //设b为此节点
p=head; //若是空表,使b作为第一个节点
if(head=NULL)
{
head=s;
s->next=NULL;
}
else if(p->Date=aDate) //若a是第一个节点
{
s->next=p;
head=s;
}
else
{
while(p->next!=NULL&&p->Date!=aDate)//查找节点a
{
q=p;
p=p->next;
}
if(p->Date=aDate) //若有节点a
{
q->next=s;
s->next=p;
}
else //若没有节点a
{
p->next=s;
s->next=NULL;
}
}
}
template<class T>
void Tlist<T>::deletelist(T aDate) //设aDate是要删除的节点a中的数据成员
{
Node<T> *p,*q; //p用于指向节点a,q用于指向节点a的前一个节点
p=head;
if(p=NULL) //若是空表
return;
if(p->Date=aDate) //若a是第一个节点
{
head=p->next;
delete p;
}
else
{
while(p->Date!=aDate&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->Date=aDate)
{
q->next=p->next;
delete p;
}
}
}
template<class T>
void Tlist<T>::outputlist()
{
Node<T>*current=head;
while(current->next!=NULL)
{
cout<<current->Date<<" ";
current=current->next;
}
cout<<endl;
}

int main()
{
Tlist<int> A;
int Date[5]={64,4,76,89,97};
A.insertlist(0,Date[0]); //建立链表A首节点
for(int i=1;i<5;i++)
A.insertlist(0,Date[i]);//顺序向后插入
A.outputlist(); //输出链表
return 0;
}
程序编译连接都可以通过,就是输出是有错误,不知道哪里有错误,请大侠帮忙看一下,谢谢
...全文
436 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
heartlesstoanyone 2012-05-30
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

template<class T>
struct Node
{
T Date;
Node* next;
};
template<class T>
class Tlist
{
private:
Node<T>* head;
public:
Tlist()
{
head=NULL;
}
void deletelist(T Date);
void insertlist(T aDate,T bDate);
void outputlist();
};

template<class T>
void Tlist<T>::insertlist(T aDate,T bDate)//在节点a之前插入节点b
{
//cout << bDate << endl;
Node<T>*p,*q,*s; //p指向节点a,q指向节点a_k,s指向节点b
s=(Node<T>*)new(Node<T>); //动态分配新节点
s->Date = bDate; //设b为此节点
p=head; //若是空表,使b作为第一个节点
if(head == NULL)
{
head = s;
s->next=NULL;
}
else if(p->Date == aDate) //若a是第一个节点
{
s->next=p;
head=s;
}
else
{
while(p != NULL && p->Date != aDate)//查找节点a ----------------here
{
cout << p->Date << endl;
q = p;
p=p->next;
}
cout << bDate << endl;
if(p != NULL) //若有节点a
{
q->next=s;
s->next=p;
}
else //若没有节点a
{
q->next=s;
s->next=NULL;
}
}
}
template<class T>
void Tlist<T>::deletelist(T aDate) //设aDate是要删除的节点a中的数据成员
{
Node<T> *p,*q; //p用于指向节点a,q用于指向节点a的前一个节点
p=head;
if(p=NULL) //若是空表
return;
if(p->Date=aDate) //若a是第一个节点
{
head=p->next;
delete p;
}
else
{
while(p->Date != aDate && p->next != NULL)
{
q=p;
p=p->next;
}
if(p->Date=aDate)
{
q->next=p->next;
delete p;
}
}
}
template<class T>
void Tlist<T>::outputlist()
{
Node<T>*current=head;
while(current != NULL)// ---------------------------------here
{
cout<<current->Date<<" ";
current=current->next;
}
cout<<endl;
}

int main()
{
Tlist<int> A;
int Date[5]= {64,4,76,89,97};
A.insertlist(0,Date[0]); //建立链表A首节点
for(int i=1; i<5; i++)
A.insertlist(0,Date[i]);//顺序向后插入
A.outputlist(); //输出链表
return 0;
}

softorsuper 2012-05-29
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
#include"list.h"
template<class T>
void Tlist<T>::insertlist(T aDate,T bDate)//在节点a之前插入节点b
{
Node<T>*p,*q,*s; //p指向节点a,q指向节点a_k,s指向节点b
s=(Node<T>*)new(Node<T>); //动态分配新节点
s->Date=bDate; //设b为此节点
p=head; //若是空表,使b作为第一个节点
if(head==NULL) /***这里要有判断等啊,不是赋值,下面同此*****/
{
head=s;
s->next=NULL;
}
else if(p->Date==aDate) //若a是第一个节点 /***这里要有判断等啊,不是赋值,下面同此*****/
{
s->next=p;
head=s;
}
else
{
while(p->next!=NULL&&p->Date!=aDate)//查找节点a
{
q=p;
p=p->next;
}
if(p->Date==aDate) //若有节点a 这里要有等号啊 /***这里要有判断等啊,不是赋值,下面同此*****/
{
q->next=s;
s->next=p;
}
else //若没有节点a
{
p->next=s;
s->next=NULL;
}
}
}
template<class T>
void Tlist<T>::deletelist(T aDate) //设aDate是要删除的节点a中的数据成员
{
Node<T> *p,*q; //p用于指向节点a,q用于指向节点a的前一个节点
p=head;
if(p=NULL) //若是空表
return;
if(p->Date==aDate) //若a是第一个节点 /***这里要有判断等啊,不是赋值,下面同此*****/
{
head=p->next;
delete p;
}
else
{
while(p->Date!=aDate&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->Date==aDate) /***这里要有判断等啊,不是赋值,下面同此*****/
{
q->next=p->next;
delete p;
}
}
}
template<class T>
void Tlist<T>::outputlist()
{
Node<T>*current=head;
while(current->next!=NULL)
{
cout<<current->Date<<" ";
current=current->next;
}
cout<<endl;
}

int main()
{
Tlist<int> A;
int Date[5]={64,4,76,89,97};
A.insertlist(0,Date[0]); //建立链表A首节点
for(int i=1;i<5;i++)
A.insertlist(0,Date[i]);//顺序向后插入
A.outputlist(); //输出链表
return 0;
}



能写这个模板说明还可以继续前进的 呵呵。




玩酷酷 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
细节上有很多问题。比如判断是否相等,你用的=号。。还有你用new分配的对内存在程序最后也没有释放掉。
[/Quote]
=号是写错了,但析构函数释放了堆内存啊!
wodetongheai 2012-05-29
  • 打赏
  • 举报
回复
自己去数据结构找去~!
i诙谐 2012-05-29
  • 打赏
  • 举报
回复
细节上有很多问题。比如判断是否相等,你用的=号。。还有你用new分配的对内存在程序最后也没有释放掉。
面向对象程序设计课程作业 1. 请创建一个数据型为T的链表模板List实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该模板的正确性: 1) 用List模板定义一个List型的模板对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List型的模板对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List型的模板对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List型的模板对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
NUDT程序设计模拟测试 1. 请创建一个数据型为T的链表模板List实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该模板的正确性: 1) 用List模板定义一个List型的模板对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List型的模板对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List型的模板对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List型的模板对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧