请教各位一个问题 关于head和tail

abpoi 2009-06-12 01:34:21
#include <cstdlib>
#include <iostream>

using namespace std;

struct Node
{
int Data;
Node *next;
};
class list
{
Node *head,*tail;
public:
list(){head=NULL;}
void insertlist(int aData,int bData);
void deletelist(int aData);
void outputlist();
void outputReversedlist();
Node *gethead(){return head;};
};

void list::insertlist(int aData,int bData) //设aData是结点a中的数据,bData是结点b中的数据
{
Node *p,*q,*s; //p指向结点a,q指向结点a_k,s指向结点b
s=(Node*)new(Node); //动态分配一个新结点
s->Data=bData; //设b为此结点
p=head;
if(head==NULL) //若是空表,使b作为第一个结点
{
head=s;
s->next=NULL;
}
else
if(p->Data==aData) //若a是第一个结点
{
s->next=p;
head=s;
}
else
{
while(p->Data!=aData && p->next!=NULL)//查找结点a
{
q=p;
p=p->next;
}
if(p->Data==aData) ///若有结点a
{
q->next=s;
s->next=p;
}
else //若没有结点a;
{
p->next=s;
s->next=NULL;
}
}
tail=head;
}
void list::deletelist(int aData) //设aData是要删除的结点a中的数据成员
{
Node *p,*q; //p用于指向结点a,q用于指向结a的前一个结点
p=head;
if(p==NULL) //若是空表
return;
if(p->Data==aData) //若a是第一个结点
{
head=p->next;
delete p;
}
else
{
while(p->Data!=aData&&p->next!=NULL) //查找结点a
{
q=p;
p=p->next;
}
if(p->Data==aData) //若有结点a
{
q->next=p->next;
delete p;
}
}
}
void list::outputlist()
{
Node *current=head;
while(current!=NULL)
{
cout<<current->Data<<" ";
current=current->next;
}
cout<<endl;
}
void list::outputReversedlist()
{
Node *temp;
Node *_next=NULL;
do
{
temp=tail->next;
tail->next=_next;
_next=tail;
tail=temp;
}
while(tail->next!=NULL);
tail->next=_next;
head=tail;
head->next=_next;

while(tail!=NULL)
{
cout<<tail->Data<<" ";
tail=tail->next;
}
}
int main()
{
list A,B;
A=list();
B=list();
int Data[10]={25,41,16,98,5,67,9,55,1,121};
A.insertlist(0,Data[0]); //建立链表A首结点
for(int i=1;i<10;i++)
A.insertlist(0,Data[i]); //顺序向后插入
cout<<"\n链表A:";
A.outputlist();
cout<<"逆序后的链表A:";
A.outputReversedlist();
A.deletelist(55);
cout<<"\n删除元素55后:";
A.outputlist();
B.insertlist(0,Data[0]); //建立链表B首结点
for(int i=0;i<10;i++)
B.insertlist(B.gethead()->Data,Data[i]); //在首结点处顺序向后插入
cout<<"\n链表B:";
B.outputlist();
B.deletelist(67);
cout<<"删除元素67后:";
B.outputlist();
getchar();
return 0;
}


程序执行顺序是先正序
然后倒序,再调用outpulist(),用head能出结果,用tail结果就是空的
请问一下这是为什么。。
...全文
280 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lylm 2009-06-12
  • 打赏
  • 举报
回复
tail此时是尾节点,自然输出空
Sou2012 2009-06-12
  • 打赏
  • 举报
回复
一个表示首,一个表示尾,方便操作!!

如果没有首尾,难道还到 首 - 1, 和 尾 - 2 啊?不太方便操作吧?
性能侠客行 2009-06-12
  • 打赏
  • 举报
回复
似乎 没有发现问题哦。。
  • 打赏
  • 举报
回复
晕,楼主,干嘛纠结在一个命名上。
pathuang68 2009-06-12
  • 打赏
  • 举报
回复
硬币的正面叫head,反面叫tail。 -- 这是叫法之一:)
「已注销」 2009-06-12
  • 打赏
  • 举报
回复
我用的是VC10,通过:
#include <cstdlib>
#include <iostream>

using namespace std;

struct Node
{
int Data;
Node *next;
};
class list
{
Node *head, *tail;
public:
list() {head = NULL;}
void insertlist(int aData, int bData);
void deletelist(int aData);
void outputlist();
void outputReversedlist();
Node *gethead() {return head;};
};

void list::insertlist(int aData, int bData) //设aData是结点a中的数据,bData是结点b中的数据
{
Node *p, *q, *s; //p指向结点a,q指向结点a_k,s指向结点b
s = (Node*)new(Node); //动态分配一个新结点
s->Data = bData; //设b为此结点
p = head;
if (head == NULL) //若是空表,使b作为第一个结点
{
head = s;
s->next = NULL;
}
else
if (p->Data == aData) //若a是第一个结点
{
s->next = p;
head = s;
}
else
{
while (p->Data != aData && p->next != NULL)//查找结点a
{
q = p;
p = p->next;
}
if (p->Data == aData) ///若有结点a
{
q->next = s;
s->next = p;
}
else //若没有结点a;
{
p->next = s;
s->next = NULL;
}
}
tail = head;
}
void list::deletelist(int aData) //设aData是要删除的结点a中的数据成员
{
Node *p, *q; //p用于指向结点a,q用于指向结a的前一个结点
p = head;
if (p == NULL) //若是空表
return;
if (p->Data == aData) //若a是第一个结点
{
head = p->next;
delete p;
}
else
{
while (p->Data != aData && p->next != NULL) //查找结点a
{
q = p;
p = p->next;
}
if (p->Data == aData) //若有结点a
{
q->next = p->next;
delete p;
}
}
}
void list::outputlist()
{
Node *current = head;
while (current != NULL)
{
cout << current->Data << " ";
current = current->next;
}
cout << endl;
}
void list::outputReversedlist()
{
Node *temp;
Node *_next = NULL;
do
{
temp = tail->next;
tail->next = _next;
_next = tail;
tail = temp;
}
while (tail->next != NULL);
tail->next = _next;
head = tail;
head->next = _next;

while (tail != NULL)
{
cout << tail->Data << " ";
tail = tail->next;
}
}
int main()
{
list A, B;
A = list();
B = list();
int Data[10] = {25, 41, 16, 98, 5, 67, 9, 55, 1, 121};
A.insertlist(0, Data[0]); //建立链表A首结点
for (int i = 1;i < 10;i++)
A.insertlist(0, Data[i]); //顺序向后插入
cout << "\n链表A:";
A.outputlist();
cout << "逆序后的链表A:";
A.outputReversedlist();
A.deletelist(55);
cout << "\n删除元素55后:";
A.outputlist();
B.insertlist(0, Data[0]); //建立链表B首结点
for (int i = 0;i < 10;i++)
B.insertlist(B.gethead()->Data, Data[i]); //在首结点处顺序向后插入
cout << "\n链表B:";
B.outputlist();
B.deletelist(67);
cout << "删除元素67后:";
B.outputlist();
getchar();
return 0;
}
「已注销」 2009-06-12
  • 打赏
  • 举报
回复
没发现问题啊。
运行结果:
链表A:25  41  16  98  5  67  9  55  1  121
逆序后的链表A:121 1 55 9 67 5 98 16 41 25
删除元素55后:121 1 9 67 5 98 16 41 25

链表B:121 1 55 9 67 5 98 16 41 25 25
删除元素67后:121 1 55 9 5 98 16 41 25 25

65,210

社区成员

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

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