热度 13
2016-3-31 09:46
1482 次阅读|
0 个评论
我这些天在学习数据结构,发现了一些问题。闲话少叙,先上代码(参考教材:数据结构-c语言,耿国华编著,有删改) #include typedef struct node//结构体,单链表 { char data; struct node * next; }node,* linklist; int countfromtail(linklist l)//记录长度 { /*以下是原来错误的。红色字体是改进过的*/ //linklist l_copy; //l_copy = l; //p = l_copy-next; p = l-next; node *p; int count = 0; while (p!= NULL) { p= p-next; count++; } return count; } node * findlinklist(linklist l, char q)//按值查找 { node *r; r = l-next; while (l-next != NULL) { if (r-data != q) { r = r-next; } else break; } return r; } linklist creatfromtail()//链表创建 { linklist l; node *r, *s; int flag = 1; char c; l = (node *)malloc(sizeof(node)); l-next = NULL; r = l; while (flag) { c = getchar(); if (c != 'a') { s = (node *)malloc(sizeof(node)); s-data = c; r-next = s; r = s; } else { flag = 0; r-next = NULL; } } return l; } int main() { int m=0; char q='b'; linklist l; node *z; l=creatfromtail(); m = countfromtail(l); printf("the length of list is %d\n", m); z = findlinklist(l, q); printf("the charecter you want to find is %c\n", z-data); return 0; } 以上代码实现的链表的创建,对元素计数,按值查找三个功能,代码是比较简陋,但是还是比较完整的。这个代码是有问题的,可以思考一下, 好了,先说一下整个流程。从主函数main说起,第一步:定义,初始化;第二步:创建一个链表;第三步:计数,记录链表长度,并打印出来;第四步:查找一个字符,本例是查找‘b',打印出来查找的字符。 结果:创建和记录长度都正常,查找字符这一步导致控制台无响应。 我想说的第一个问题,第三步 调用countfromtail(linklist l) 以后,输出这是没有问题的。来到第四步,直接使用参数l,直接使用指针问题是:l-next指向的不是第一个,而是最后一个!!!导致第四步l-next=NULL,结果导致并不能输出’b'。 为什么出现上述问题?原因是:调用函数是值传递,将链表l传递给函数时,它的下一个节点l-next在经过第三步记录长度后已经变成了Null,而不是按照我们的意愿从第一个结点开始。为了验证这一点,在第三步复制一份指针l,对l_copy操作,以后的第四步就不会影响对l的影响。果然,这次运行符合预期。 第二个问题:链表存储的数据是char类型的,遇到‘a'就停止,把a当作结束符,这一步的确不是很好,但我说的不是这点。我想说在字符输入的时候我错误的以为回车不会当作链表元素,我是每输入一个字符敲一个回车,导致当输入n个字符时候显示长度却是2*n-1。 总结:1、指针是个坏蛋,近两天时间就是因为它,却慢慢喜欢它咯,真是磨人的小妖精。 2、关于参数传递,我觉得学的很好了,却还是栽了跟头。 努力吧,刚刚开始,路还很长!