关于C++中的链表问题

我只学过C中的链表,是在结构体中有数据元素和结构体指针。如果在C++中需要将对象用链表的数据形式组织起来,两者之间的关系是什么样的?另外有没有什么好的教材或者例子推荐的?

第1个回答  2012-07-14
// 最简单的写法是这样, 类似C的做法:
#include <iostream>
using namespace std;

class Node {
public:
int data;
Node* link;
};
Node* createSample() {
Node* p30=new Node;
p30->data=30; p30->link=0;
Node* p20=new Node;
p20->data=20; p20->link=p30;
Node* p10=new Node;
p10->data=10; p10->link=p20;
return p10;
}
void print(Node* pHead) {
cout << " [ ";
for(Node* p=pHead; p!=0; p=p->link) {
cout << p->data << ", ";
}
cout << " ] ";
}
void main() {
Node* h=createSample();
print(h); // 印出 [ 10, 20, 30, ]
}
----------------
// 稍加改良的写法是这样, 把list当成一个类:
#include <iostream>
using namespace std;

class Node {
public:
int data;
Node* link;
};
class List {
public:
Node* head;
};
List* createSample() {
Node* p30=new Node;
p30->data=30; p30->link=0;
Node* p20=new Node;
p20->data=20; p20->link=p30;
Node* p10=new Node;
p10->data=10; p10->link=p20;
List* ans=new List;
ans->head=p10;
return ans;
}
void print(List* pL) {
cout << " [ ";
for(Node* p=pL->head; p!=0; p=p->link) {
cout << p->data << ", ";
}
cout << " ] ";
}
void main() {
------------------
// 再改良的写法是这样, 把function装入list中:
#include <iostream>
using namespace std;

class Node {
public:
int data;
private:
Node* link;
friend class List;
};
class List {
Node* head;
public:
static List* createSample();
static void print(List* pL);
};
List* List::createSample() {
Node* p30=new Node;
p30->data=30; p30->link=0;
Node* p20=new Node;
p20->data=20; p20->link=p30;
Node* p10=new Node;
p10->data=10; p10->link=p20;
List* ans=new List;
ans->head=p10;
return ans;
}
void List::print(List* pL) {
cout << " [ ";
for(Node* p=pL->head; p!=0; p=p->link) {
cout << p->data << ", ";
}
cout << " ] ";
}
void main() {
List* p=List::createSample();
List::print(p); // 印出 [ 10, 20, 30, ]
}
--------------------
// 进一步的写法是这样, 把print写成nonstatic:
#include <iostream>
using namespace std;

class Node {
public:
int data;
private:
Node* link;
friend class List;
};
class List {
Node* head;
public:
static List* createSample();
void print();
};
List* List::createSample() {
Node* p30=new Node;
p30->data=30; p30->link=0;
Node* p20=new Node;
p20->data=20; p20->link=p30;
Node* p10=new Node;
p10->data=10; p10->link=p20;
List* ans=new List;
ans->head=p10;
return ans;
}
void List::print() {
cout << " [ ";
for(Node* p=this->head; p!=0; p=p->link) {
cout << p->data << ", ";
}
cout << " ] ";
}
void main() {
List* p=List::createSample();
p->print(); // 印出 [ 10, 20, 30, ]
}
-------------
还可以再添加 List的 constructor, destructor, assignment.
第2个回答  2012-07-09
c++中的链表相对之下更为复杂。因为它要确立对象,用class来建立链表,需要共有成员、私有成员,还有类独特的封装性。并不是说你懂得函数构建就能写出来,c++的链表语法较之复杂,但可移植性非常好!关于此点只有你学了才能体会出来。另外,数据结构是一种思想,你c的链表学会了,c++学的也快。总之c++和c的却别很大,功能比c多,所以语法也有点复杂。但有些时候用起来是很方便的。本回答被提问者和网友采纳
第3个回答  2012-07-13
C++和c语言中的链表是一样的,C++是C语言的扩展,扩展的内容如下:
1、类(类的多态、封装、继承)
2、重载(重载是一个很重要的概念,包括函数的重载和运算符的重载)
3、一些小概念上的修改,new和delete运算符的增加const,等等.
4、C++是完全兼容C的,也就是里面有的概念,C++里都用,并且都能用。
所以,像链表,结构体,共同体。这些都是不变的。
有本书叫C++primer plus是我认为最好的一本C/C++教材。建议好好看看。
第4个回答  2012-07-09
差别不大,如果你把成员写成public的话,把结构体指针换成对象的指针就行了。
但是类的功能可以更强大,你应该考虑在类中增加更多的成员函数。
或者你可以将链表的节点仍然用结构体写,但是用一个类来管理整个链表。追问

你的意思是不是我在类的数据成员里面加一个类的指针就可以把该类对象的用链表的方式连接起来了?然后对数据进行操作的时候就把头结点也就是第一个对象的指针穿进函数里,然后对不同的对象进行操作?

追答

是的,但是如果成员是私有的,外部函数将无法访问,需要另外写接口函数。
所以一般会把有关的链表操作函数全部写成类的成员函数。
最好是把head指针放在另一个类里,用这个类的成员函数来实现功能。

追问

头指针放在另一个类里我不是很理解。假设我建立了一条客户类的对象链表,头结点按你的描述是什么状态呢?不放在自己这个类的第一个对象里吗?请解释一下哈,谢谢!

追答

比如你已经用C语言实现了一个链表,然后你在C语言中需要用各种函数来操作这个链接。
你可以将这个链表的头放在一个类list中,然后把所有的函数写成类的成员函数,包括遍历,添加,删除。然后在使用这个类的时候就可以完全使用成员函数来操作,而不用管指针的细节。
而如果你的链表节点也是用类写的话,每个节点的成员结构最好是一样的,最好不要把头放在某一个节点中。

第5个回答  2012-07-09
定义一个指向对象的指针,再定义一个结构体,结构体成员为两个指针,前者指向对象,后者指向下一个结构体,或者你把类产生的对象放在静态区,人工分配内存吧

c++ MFC 里的链表问题(内详)
链表是一种数据结构,就像是一个一个的珠子串起来的链子,每个珠子就是一个结构体变量(当然这是C语言中的说法,要是是C++的话,每个珠子就是一个对象了),这种数据结构可以很方便地的访问每个元素,一般它是与数组相对的,数组是串行的,按照索引来访问元素,而链表是靠结构体中存储的下一个元素的...

c++里面的链表结构到底是怎样的,我一点都弄不懂
定义一个结构体或者类 作为节点的类。然后用这个类new出一个一个的对象,就可以作为链表的节点了,然后用节点的指针域的值 来连接这些节点 就成了链表,网上有程序的,说不明白的 自己多找点程序 ,然后写。我以前不明白链表,然后我就用链表写了一个贪吃蛇。然后就明白了 ...

c++ 链表,,求指导,程序崩溃,line:1044
链表的最后一个节点的next的值,是否设置为NULL了,如果没有设置,到了最后一个节点的时候,就会出现崩溃.你的链表中的每个节点的next值,是否都对了,如果有任一个节点的next没有指向有用的节点的话,就会访问不被允许访问的内存,导致崩溃.考虑下在进入循环的第一次是否就有问题,因为循环里,并没有判断p...

C++中链表初始化
结构体中 typedef struct Cwow{string name;string sex;string profession;struct Cwow * next;}Cwow;string是C++的东西。而这里 p1=p2=(Cwow *)malloc(sizeof(Cwow));malloc是纯c的东西,如此混用当然出异常,请改为new:p1=p2=new Cwow;这样就好了,所有用malloc的地方都该为new ...

c++ 链表,,求指导,程序崩溃,line:1044
1.链表的最后一个节点的next的值,是否设置为NULL了,如果没有设置,到了最后一个节点的时候,就会出现崩溃.2.你的链表中的每个节点的next值,是否都对了,如果有任一个节点的next没有指向有用的节点的话,就会访问不被允许访问的内存,导致崩溃.3.考虑下在进入循环的第一次是否就有问题,因为循环里,并没...

c++链表栈问题
1.建立抽象模型,说起来这件事得追溯到C++本身的结构上:从广义上看,类是一个数据操作集合体,即使数据结构也不外乎如是。那么我们必须知道栈需要什么——这是一切问题的起点。数据结构是数据模型的实现,围绕数据为中心,操作为主要手段的语义模型。真正具体化到C++的类中,我们就是要确定储存结构(...

c++链表问题
答:所以你的答案是对的,但是要注意过程。还有 s->link = new Node;的话结构是什么样的?是[25 | ? ] 还是 [25 | ]--->[ ? | ? ]?问号代表不知道 答:S->link的值发生改变,指向了一个新的内存区域。如果r=s->link会是什么样的结构?答:链表的结构就是图中所示了,...

c++ 链表 删除各种情况节点问题。。。求教。。在线等。。。
一、结尾节点无法删除的问题,你可以想象一个只有三个节点的链表,结尾节点的ID=findid,开始时,p指向第二个节点,然后执行到第一个if时,由于p->next->ID==findid,于是执行第二个if语句,但是此时p->next->next是等于NULL的,所以删除节点的代码没被执行。二、当只有一个结点时,因为一开始定义...

怎样更好的理解C++中的链表的使用?
首先,我们把链表的节点比喻成火车的车厢。每节车厢的前面都有一个钩子,我们把这想想成指针,他用来连接上一节车厢。接着,使用尾插法的话,也就是先要找到火车尾,即链表的尾指针。然后把自己要加进去的车厢挂到火车的最后面。最后标记这节车厢为火车尾(把地址赋值给尾指针)。使用头插法的话,...

C++单链线性表的初始化问题
L->next=p; \/\/ █ 代表节点 <--- 代表指针 你那个程序指针是这样指的 █ <-- █ <-- █ <--- █for循环一结束就指向最后面的节点了 这样L是往后移动的, 所以输出时倒着输出 L-next存储p上次创建的节点的地址 p是后来创建的节点 所以后面节点总是指向前面的节点 ...

相似回答