我这些天在学习数据结构,发现了一些问题。闲话少叙,先上代码(参考教材:数据结构-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、关于参数传递,我觉得学的很好了,却还是栽了跟头。
努力吧,刚刚开始,路还很长!
文章评论(0条评论)
登录后参与讨论