关于带表头的单链表的几个疑惑,请大家帮忙解答

coolice410 2011-02-21 05:27:28
一下是本参考书上的代码:
#include<stdio.h>
#include<stdlib.h>

struct Student //定义节点类型
{
char name[20];
float score;
Student *next;
};
struct StudentList //定义表头
{
Student *head;
Student *tail;
float averScore;
int unQualifiedStu;
int stuNum;
};

int main()
{
StudentList linkHead; //问题一:此处如果把linkHead 声明为一个指针(StudentList *linkHead)可以吗?

linkHead.head=linkHead.tail=NULL;
linkHead.averScore=0;
linkHead.unQualifiedStu=0;

Student *student;
while(1)//插入节点
{

student=new Student;
// 问题二:此处student是一个指针类型,为什么动态分派内存时不写成student=new Student*呢?
scanf("%s %f", student->name,&student->score);
if(student->score<0)
{
delete student;
break;
}
student->next=NULL;
if(linkHead.tail==NULL) //问题三:如果此处的判断条件改成if(linkHead.head==NULL)可以吗?
{
linkHead.head=student;
linkHead.tail=student;
}
else
{
linkHead.tail->next=student;
linkHead.tail=student;
}
linkHead.averScore+=student->score;
if(student->score<60)
linkHead.unQualifiedStu++;
linkHead.stuNum++;
}
linkHead.averScore=linkHead.averScore/linkHead.stuNum;
while(linkHead.head!=NULL)//问题四:如果此处的判断条件改成(linkHead.tail!=NULL)可以吗?有什么区别?
{

student=linkHead.head;
linkHead.head=student->next;
delete student;
}
}
...全文
135 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ffjj56 2011-02-21
  • 打赏
  • 举报
回复
见楼上,指针再神秘到了汇编里也不过是些简单的寻址
赵4老师 2011-02-21
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
fulima007 2011-02-21
  • 打赏
  • 举报
回复
(1) StudentList *linkHead;
linkHead=new StudentList;
可以这样写的。
(2)不可以,如果你new 一个指针类型的话,那么你可以试试任何指针的大小都是4,sizeof(指针)
(3)可以,就看你最后怎么判断的了
newfarmerchi 2011-02-21
  • 打赏
  • 举报
回复
1. 可以。
2. new 后面跟的是类型。*student 是个指针, 给student这个地址分配
一个Studnet类型的空间。
3. 可以。
4. 不可以。 此时的linkHead.tail已在链表的尾部,
判断它是否为零与linkHead.head=student->next;无关。
while会一直进行下去,也就是说一直delete student,
直至程序崩溃。
TimZhuFaith 2011-02-21
  • 打赏
  • 举报
回复
最后问题 单链表具有next指针,当然从Head开始循环方便了。。。
pengzhixi 2011-02-21
  • 打赏
  • 举报
回复
问题一:此处如果把linkHead 声明为一个指针(StudentList *linkHead)可以吗?
可以,但是记得使用前初始化这个指针。

问题二:此处student是一个指针类型,为什么动态分派内存时不写成student=new Student*呢?
额,你还没弄清楚new是一个什么概念?new首先在堆上分配一个变量的大小sizeof(Student)。然后在这个分配的内存上构造这个对象,然后将分配的内存的地址返回。

问题三:如果此处的判断条件改成if(linkHead.head==NULL)可以吗?
因为你是要在尾部插入,所以判断为指针是否为NULL

coolice410 2011-02-21
  • 打赏
  • 举报
回复
谢谢大家的回复,小弟学习了!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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