永发信息网

关于数据结构中单链表尾插法问题

答案:1  悬赏:0  手机版
解决时间 2021-01-25 07:04
  • 提问者网友:风月客
  • 2021-01-24 15:56
大家知道,尾插法和头插法是建立链表的方法,书上写的是这样的: LinkList CreatListR1(void) { char ch; ListNode *m,*n; n=(ListNode *)malloc(sizeof (ListNode)); m=head; while((ch=getchar())!='\n') { n->data=ch; head->next=n; m=n; } n->=NULL; return head; } 这里我想问下: 1、为什么用这个尾插法建表时给函数的返回值类型定义为LinkList?,定义成void不行吗?还有函数的()里面怎么会是void?如果返回值能是void,那么没有了return head还对吗?为什么要return这个head呢?这个head指代这个链表吗? 2、可以看出尾插法是让ch这个变量为char型,那么如果是其他类型该怎么写那个循环体呢?肯定不是 while((ch=getchar())!='\n') 了吧?但是如果不是怎么写啊?我只能想到到输入回车结束,想不出其他的,所以只能用字符了,如果是int,肯定不是'\n'了吧 ,那该怎么判定输入结束呢?还有用不了getchar()该用什么啊?scanf也不行啊? 以上问题求高手详细指点!!!!!!!!!!!
最佳答案
  • 五星知识达人网友:煞尾
  • 2021-01-24 17:02
这程序不对 head->next=n;应该改成m->next=n; 我来解释一下吧: 1.为什么用这个尾插法建表时给函数的返回值类型定义为LinkList? 返回LinkList的原因:这个方法的功能就是建立一个链表,如果你没有返回值的话,那么你如何得到建立的链表呢? 2.定义成void不行吗? 定义成void就是不返回值,这个时候,你在方法中废了半天劲建立起来的链表在方法返回时就丢了(而且是内存泄漏),这是肯定不可以的。(当然,也可以使用参数传递,这种情况可以定义为void) 3.还有函数的()里面怎么会是void? 参数列表(就是方法名称后边括号里面的东西)写上void就是说在调用这个方法的时候,不需要提供任何参数,当然了,这个void完全可以去掉不写(功能是一样的)。 4.如果返回值能是void,那么没有了return head还对吗? 如果这个方法的返回值是void(就是定义为:void CreateListR1(void){...}),没有return head是正确的,实际上有了return head 反而错了。因为,如果你的返回值类型定义为void 就是说这个方法不会返回任何类型,此时你若尝试返回一个值,就会出现编译错误。 5.为什么要return这个head呢? 这是因为这个方法在定义(声明)的时候,告诉编译器"我要返回一个LinkList", 就似乎是跟编译器签下了合同,所以方法在结束的时候必须按照约定返回一个LinkList的值(head 类型就是LinkList),否则编译器就认为出现编译错误 6.这个head指代这个链表吗? 当然可以。head是一个指向LinkNode结构体的指针,每一个LinkNode里有包含了下一个LinkNode的指针。这个链表就是好多个LinkNode前后相连形成的(就像铁链子一样),而head就指向了这个链表的第一个节点,因此,通过head我们就得到了第一个节点,有了第一个节点就能得到第二个节点,以此类推。随意,head完全可以代表整个链表。 7.你问的第二个大问题 你要注意一点,要让链表存储什么类型的值,这个是由你说了算的,根据程序我可以推出LinkNode及LinkList定义为: typedef struct Node { char ch; Node* next; } LinkNode,*LinkList; 看到char ch了吧,如果把char 换成int,就能保存整数了,换成其他也可以 举个例子,换成int ch吧。这个时候,通常是要规定一个终止值(比如-1),这样,用scanf获取到-1以后就认为数据结束 但有时候我们希望能够保存全部整数,这个时候,就要用到一个特殊值,EOF,循环就变成这样: int i; while(scanf("%d",&i) != EOF) // 也可以直接while(scanf("%d",&i)),是一样的 { ...... } EOF(EndOfFile)被定义为-1,这个值的输入方法为(在控制台):ctrl+z,这样就能结束输入了。 你需要加强对于链表及指针的认识,指针这个东西在数据结构里出镜率相当高,而且很多算法也会用到链表来存储数据
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯