下面算法是数据结构单链表的创建函数。在学习链表时,曾对节点的创建感到非常迷惑,经过多番查找资料,再加上不放过任何一个问题的心态,终于找出了困惑自己的原因所在。po出次文以便有需要的人。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int Elemtype; 5 typedef struct linklist 6 { 7 Elemtype data; 8 struct linklist *next; 9 10 }list,*link_list; 11 12 link_list create_linklist(link_list l, int n)//创建单链表 13 { 14 link_list p,q; 15 int x; 16 l=(list*)malloc(sizeof(list));//创建单链表头结点 17 l->next=NULL; 18 //l->data=10;//test 19 20 q=l; 21 //printf("%d,%d",l->data,q->data);//test 22 printf("please input %dx:\n",n); 23 for(int i=1;i<=n;i++) 24 { 25 p=(list*)malloc(sizeof(list));//产生一个新结点 26 scanf("%d",&x); 27 p->data=x; 28 29 p->next=NULL; 30 q->next=p; 31 q=q->next; 32 } 33 return l; 34 } 35 36 void display(link_list l)//显示链表 37 { 38 link_list p; 39 p=l->next; 40 while (p) 41 { 42 printf("%d->",p->data); 43 p=p->next; 44 } 45 printf("\n"); 46 } 47 48 int main() 49 { 50 link_list x,y; 51 int a=4; 52 y=create_linklist(x, a); 53 printf("please output linklist :\n"); 54 display(y); 55 return 0; 56 }
刚学链表的我一直想不明白q=l;的含义,几番在草稿上画图也出现很多矛盾。最后才发现原来是我理解错了q,l以及p的含义。
之前一直以为q,l是创建出来的节点,认为q=l意思是创建一个q节点而且和让它和 l 是一模一样的,但错了。
其实l,q都是指向节点的指针类型,而q=l就是让q指向l所指的节点(暂且称作节点1),即他们都指向节点1。
这样的话q->next=p和l->next=p是一样的作用(可以用printf打印出来验证),都是让节点1的指针域指向指针类型p所指的节点(暂且称作节点2)。有人把代码中的q->next=p改成l->next=p却出了错。原因是改动了q->next=p语句在while循环中,当循环执行到第二次的时候,由于第二个节点的指针域是NULL,所以q=q->next;这句自然就出错了。在这里要说的是,虽然某些不同的表达含义相同,但在实际上在算法的实现中,他们又能发挥不同的作用,以上就是例子;
q相当于是一个游标,是为了形成链表而设。for()循环每执行一次,他就后移一次,即q=q->next,意思是指针类型q指向下一个指针类型(在这里是p)所指的节点。总是保证q指向最后一个节点,就能在循环中创建新节点时,让新节点能和前面一个节点形成链的关系。
思维容易出错的地方:不能够充分理解或者一时之间没能正确看待指针类型这个特殊的类型,直接把l,q,p当成了节点,而事实上他们是指向节点的指针,他们是指针而非节点。
总结:在学习新知识时所遇到的问题往往是因为基础薄弱,往前翻一番以前学过的相关内容,也许对解决问题有很大启发。