c++指针中带->运算符看不来,

部分代码:
class list
{
public:
list *head;
list *tail;
list *next;
int num;
list()
{ head=tail=next=null;}
}
class queue:public list{};
queue类中存储函数看不来,如下
void queue::store(int i)
{
list *item;
item=new queue;
item->num=i;
if(tail)
tail->next=item; //这里怎么看啊
tail=item;
item->next=NULL; //这里也看不懂
if(!head)
head=tail; //也不清楚
}

class list
{
public:
list *head;
list *tail;
list *next;
int num;
list()
{ head=tail=next=null;}
}
class queue:public list{};
queue类中存储函数看不来,如下
void queue::store(int i)
{
list *item;
item=new queue;
item->num=i;数据赋值
if(tail)
tail->next=item; //这里怎么看啊,解答:插入到表尾
tail=item; //另外:这里也很关键,新的数据在表的尾部,让尾指针指向新的表尾,
item->next=NULL; //这里也看不懂,解答:尾指针tail=item,item->next=NULL表示链表结束,
if(!head)
head=tail; //也不清楚,解答:如果插入前是空表,head==NULL,给头指针赋值
}

list 有三个指针 list *head,*tail,*next;
next 是实际的链表指针,head 永远指向表头,tail 永远指向表尾。
链表用 头尾指针来指示链表的存在,这个链表非常浪费空间,
插入新数据是分配一个新节点,
新数据插入表尾,tail->next=item;
tail 重新指向新数据 item(tail=item)
item->next=NULL;把新数据(新表尾的链表指针设为空,表示最后一个数据,方便查找)
如果插入前是空表,head =item,给头指针赋值为新数据(此时表内只有一个节点item)
head=tail,和head =item效果一样
实际上应修改如下比较好:

class list
{
private
struct node
{
node *next;
int num;
node():i(0),next(NULL){};
node(int i):next(NULL),num(i)
{
next =new node;
next->next=NULL;
};
node *insert(int i)
{
if(next==NULL)
{
next =new node;
next->next=NULL;}
else
{
next ->next =new node;
next->next=NULL;}
}
return next;
};
node *head,tail;

public:

node *head;
node *tail;
// list *next;
// int num;
list()
{ head=tail=null;}
void inserttail(int i)
{
if (!tail)tail=new node(i);
else tail = tail->insert(i);
if(head==NULL)head=tail;
};
class queue:public list{};

void queue::store(int i)
{
inserttail(i);
};
即,表和节点分开分别为list,node。 queue 继承自list,
这样,节点只有一个指针,表有表头表尾两个指针,所有链表代码都在list,node里,queue只负责queue类的新功能,结构比较清晰。
node,实现链表的插入,删除代码,list维护表头表尾两个指针,较为节省内存。
指向运算符的作用是简化(*p).d 为p->d 代码清楚并节省一个字符。
这里问题出在链表其实是用C做的,可是用C++封装代码时,把Node 和head,tail两个指针封装到一起了
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-14
queque是list类的子类,但没有增加任何新的东西,所以基本上二者是等价的,但对于某些编译器较严格的语法要求强制转换。
你说的那个地方,item是list类指针,并分配了queue即list类空间;tail本身是指针,它指向的对象的内部成员(public型)的访问必须使用“->”操作符。而next也是list类指针,所以tail->next=item;的意思就是把item指向的单元地址送给tail->next指针,这里list实际是要建立链表,且默认把新增的单元比如这里的item作为链表的最后一个单元(当前tail(不为空时)指针指向的下一单元的next指针指向这个新单元,且tail改为这个新单元地址,而这个新单元后面没有其他单元,因此item的next为NULL)。

从程序看,这是一个后进入尾的双向链表(当前面的单元head指向的不存在时,必须将其指向最后一个单元,实质上由构造函数初始化将head=tail=next=null;可知当链表中仅有一个单元时head=tail=item)。追问

还是不能理解啊,tail和next不是同级的指针吗?用了成员指向符让我觉得tail也指向一个list的类空间,而next为这个类空间的成员指针,这个函数用来建立一个链表,我看不来如果输入i,他放哪里,怎么放了?

追答

关键这里是对指针概念的理解和掌握以及对于链表的实际单元都是临时分配(地址空间不连续)时如何将它们能够串起来!
就像猜谜一样,你只有找到至少一个单元(head或tail)时才能找到所有单元,那前提就是这一个单元必须具有其他相关的信息,这就是这里next的作用。
我前面写得不完全正确,这边链表实际上是单向链表,但提供了一个指向最后单元的地址。
本质上,既然指针是地址,它无所谓类型,你的list类完全可以这样写:
class list
{
public:
void *head;
void *tail;
void *next;
};
只是在后面的访问中必须进行强制转换,才能按list的结构(class实际上是struct的扩展)访问其中的成员。

本回答被网友采纳
第2个回答  2012-12-14
tail, item, head 都是list类这个类型的指针,既然是指针就可以用->
然后next又是list这个类里面的公开成员,所以可以指针指过去。
head=tail就理解为普通的指针等号运算符操作就可以了

在C++中,怎么理解“->”是一个单目运算符,它的操作数时什么,返回值又是...
A->B,基本上是把A当作指针在用,虽然有时是类只不过重载了->,但是你这么理解绝对错不了,与.的功能差不多,也是得到地址执行相应代码)。简单的说->左边是指针,.左边是对象 下面是链表的模版类,重载了此操作符,希望你能看得懂 \/\/ 练习:仿照STL实现一个双向线性链表模板容器#include <iostre...

在C++中,怎么理解“->”是一个单目运算符,它的操作数时什么,返回值又是...
->的左边是变量,而右边只能是成员,由于不指定所属对象的成员本身不能作为函数参数,所以->的运算符重载函数只能被看作接受一个操作数,其返回的是一个指针(也就是说A->B的时候如果A不是指针,则解释为c->B,其中c是对A调用运算符函数->所返回的指针)...

c++ ->是什么
->代表指向它内部的属性。当对象是实体的时候不能用“->”,要用“.”。而当是对象实体的地址的时候则用“->”如:class A \/\/定义类 { void p();};A a;\/\/申明对象 要调用p()方法,则可以用下列语句:a.p();或者 (&a)->p(); 其中 &a 代表a对象的地址。head=head->next 其中...

c++中使用指针的.和->运算符的区别
一般,结构体和类中,对于非结构指针实例用"."(下面的pt),而指针型的结构体实例用"->"(下面的*p)。举例子来说:struct point { int x;int y; \/\/包含两个变量成员 };void main(){ point pt;point *p;pt.x=1;pt.y=2;cout<<pt.x<<endl<<pt.y<<endl;\/\/不能用“->”cout<<p...

c++中 -> 是什么意思,如何使用
->是指针的指向运算符,通常与结构体一起使用。具体使用方法可以参考如下程序:include<stdio.h>struct stu \/\/ 定义一个结构体{ char name[10]; \/\/ 姓名 int num; \/\/ 学号 int age; \/\/ 年龄};void main(){ struct stu *s; \/\/ 定义一个结构体指针 char str[]...

c++中的->>是什么意思?
->> 这个不可能是重载的,因为重载只能是已经存在的运算符,而->>我是没见过。如果你指的是 -> ,那么这个是指针。如果你指的是 >> , 那么这个是输入流。其他的我也不知道了,呵呵,孤陋寡闻了我。。。

c++中的 -> 是什么意思?
这个符号出现在变量作用域中,是一个作用与运算符 当全局变量和局部变量重名时,在快内全局变量将被屏蔽,要想访问全局变量时就要用 “::”例如 include<iostream.h> int x ;int main(){ int x =12 ;cout << " x = " << :: x << endl ;return 0 ;} 说明:主函数外面的叫全局变量...

c++中的:: -> >>分
C++中的两个特殊运算符,::和->>>,对于程序的变量管理和数据操作具有重要意义。首先,作用域运算符"::"用于控制变量的作用域。在函数或代码块内部,如果遇到与全局变量同名的局部变量,通过"::"可以在当前作用域之外找到全局变量,以避免命名冲突。"::"就像一个导航工具,帮助我们明确变量的来源范围...

C++中“->”和“.”在使用中有什么区别呢
1、->是指针指向其成员的运算符 .是结构体的成员运算符。最大的区别是->前面放的是指针,而.前面跟的是结构体变量。2、例如:struct A{ int a; int b;};A *point = malloc(sizeof(struct A));point->a = 1;A object;object.a = 1;...

C++语法错误 : 缺少";"(在"->"的前面)
1 SimpleCircle *itsRadius2 = NULL;定义了一个指向SimpleCircle类型的空指针,这样你后一句就不能运行了;要么就是:1 SimpleCircle itsRadius2;这样就是对SimpleCircle这个类实例化,然后就可以执行后面一条语句了。这样的话要把后一条语句的->改为点运算符(.)。因为->是用于指针的。你的代码应该...

相似回答