小弟新说数据结构,有关数据结构连表的不解

pwtitle 2004-08-11 06:14:42

小弟新说数据结构,有些基本概念不清楚,请教教我,不胜感激!!!

看书上的例子是
....
struct Stu{
long number;
float score;
Stu *next;
};

Stu *head;

Stu *Create()
{
Stu *pS; // 创建的结点指针
Stu *pEnd; // 链尾指针
pS = new Stu; // 新建一个结点,准备插入链表
cin>>pS->number>>pS->score;
head = NULL; // 开始链表为空
pEnd = pS;
pEnd->next = NULL;
delete pS;
return (head);
}


有关create函数有几点不明白

1、pS = new Stu; // 新建一个结点,准备插入链表
cin>>pS->number>>pS->score;
这里分配了堆空间并且赋值,是不是说这是链表的第 1 个结点?那为什么后来有delete pS,删除这个结点呢?

2、如果1中所提的pS是第一个结点,那head不应该纪录下这第一个结点的地址吗?为什么却是纪录NULL呢?

3、如果pS不是第一个结点, pEnd = pS又怎么解释呢?

...全文
114 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2004-08-11
  • 打赏
  • 举报
回复
>> 这本书真TM垃圾,既然是C++教程,为什么还要用struct?
>> 真是垃圾 忍不住再骂一次 楼主 以后遇到这样的题 用class。

——阁下能否告诉我,class 和 struct 到底有什么区别?除了默认访问权限之外。不要跟我说他们代表了不同的意识形态,我不相信这个:)

=======================================

代码里面 delete pS; 确实是错误的,因为 head 已经指向了 pS 指向的位置,这样 delete,刚建立的根节点也就被施放了。这样 return 属于返回错误地址。

struct Stu{
long number;
float score;
Stu *next;

Stu () : next(0), number(0), score(0.0f) {}

static Stu * head, tail;

static Create ()
{
assert (head == 0);
assert (tail == 0);
head = new Stu ();
cin >> head -> number >> head -> score;
return head;
}
};

static Stu * Stu::head = 0;
static Stu * Stu::tail = 0;
pwtitle 2004-08-11
  • 打赏
  • 举报
回复
楼上骂的爽,强烈加分!
ntxs 2004-08-11
  • 打赏
  • 举报
回复
Stu *Create()
{
Stu *pS; // 创建的结点指针
Stu *pEnd; // 链尾指针
pS = new Stu; // 新建一个结点,准备插入链表
cin>>pS->number>>pS->score;
head = NULL; // 开始链表为空
pEnd = pS;
pEnd->next = NULL;
delete pS;
return (head);
}

更正一下:
这段代码他妈的是狗屎!!!!!!!!!!!!!!1

这里 毫无理由用到 delete pS;

delete pS;要用,但绝对不是现在!!! 赶快换书!!!
他妈的,这样的书,什么玩意???
ntxs 2004-08-11
  • 打赏
  • 举报
回复
这本书真TM垃圾,既然是C++教程,为什么还要用struct?
真是垃圾 忍不住再骂一次 楼主 以后遇到这样的题 用class。

牢骚发完了,来回答问题。

1 不一定是表的第一个结点。只要知道这是个结点就可以了,至于插入到什么位置,看题目。
为什么后来要delete?
因为这个点是 new 出来了, 所以在后面一定要配上 delete。不然就会内存泄露。
delete当然不是马上使用,一般是你要删除某个结点时用,比如清除整个表的时候。

2 head = NULL
你应该明白 class中的 构造函数吧?
这个句子就相当于构造的功能——创造出一个空的链表。
有了head 你就可以插入接点 然后删除啊访问啊 都可以了

PS是第几个结点不是程序定的,是你! 你想它是第几个就第几个。
如果他是第一个结点,当然就被 head 指向了。重复? 呵呵,指针就是可以乱指,就算有n个指针指向同一个地方,那又如何呢?
一般情况下,删除和插入结点不是直接用 head = pS的语句的。
而是在类中定义类似:Insert()这样的“在当前点”插入的函数。至于这个 “当前点”是head? 中间? 还是末尾? 看程序的运行情况。

3 我已经说了 pS 是第几个结点由你控制。那么来看看为什么 要有 pEnd = pS
在整个练表开始构造的时候,一般是 head = pEnd = NULL。即:练表是空的,且有头、尾两个指针。
而 pEnd = pS;
pEnd->next = NULL;

只是表达一种插入方式: 所有的插入从尾部进行
当然你可以用另一种方式:所有插入从头布进行,看起来就象这样:
pS -> next = head;
head = pS;


最后总结一下:
我觉得楼主年纪轻轻就被钱能这本垃圾书误导怪可惜的。
换一本好点的书好吗?
买 清华出的 C++大学教程啊 挺清楚的。
我就是那本书入门的,里面还有个 用 模板写的 链表类,清晰!而且体现出面向对象的思想。

这本书,狗P不通!
hxblvc 2004-08-11
  • 打赏
  • 举报
回复
楼主,我看是你的书有问题

这一段代码是有问题的,

pwtitle 2004-08-11
  • 打赏
  • 举报
回复
钱能的那个《C++教程》。
diaoni 2004-08-11
  • 打赏
  • 举报
回复
你那本书叫什么名?????
pwtitle 2004-08-11
  • 打赏
  • 举报
回复
我知道head是纪录链地址的,可是不明白为什么在初始化的时候head=NULL,而不是第一个元素的地址pS
那pS也是纪录链首指针,和head岂不是重复了?

64,281

社区成员

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

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