注意注意注意:本文仅是作者对本人学习过程中的一些知识点的总结,不一定全面,仅供参考。
1.刚开始想不通链表操作原理的时候动手画画图,很快就可以理解指针到底在节点之前怎么发挥他的作用。
2.如果要对链表进行修改(比如插入,删除等等)那么在传值的时候要在结构指针的基础上再加一个指针,类似于这样creat_list(LinkList **head)
,其中,LinkList为结构体声明,LinkList*
即为结构指针也就是节点,那么LinkList **
就是节点的地址(这里如果改成LinkList*&
就会报错);如果只是将链表调出来,不进行任何操作(例如打印元素,查找某个元素等等),这种情况下只需要将节点(一个结构指针)传给函数即可void print(LinkList *head)
。
3.在删除节点等需要考虑首元素的时候就不能直接将第一个有数据的节点交给临时节点应该进行的操作是将头结点赋值给临时节点,然后开始遍历整个链表,直到找到合适的值为止;如果进行链表中数据的比较,或者递增排列等不需要考虑第一个数据节点位置的问题的时候,可以将第一个数据节点(即头结点的指针域head -> next)交给临时变量。
4.一般来讲还是用尾插法建表(不论单链表还是双链表),因为尾插法建表在对数据进行输出时,他们的顺序和你输入数据的顺序是相同的,而头插法会导致输入的数据与打印出来的数据顺序恰好相反。
5.在进行遍历链表或者建表的时候,对于单链表,不要忘记最后一个节点的指针域处理;对于双链表而言,不要忘记对指向前驱节点的指针的修改以及最后一个节点后继指针的修改。
6.当对链表进行修改(比如插入,删除等等)那么在传值的时候要在结构指针的基础上再加一个指针,类似于这样creat_list(LinkList **head)
,在临时节点赋值的时候要在head之前加上*,因为传入的head是地址,应该在解引用之后在进行传值。例如:
void creat(linklist *head) //单向循环链表头插法建表
{
Linklist *p; //注意head都是(*head)
(*head) = (linklist)malloc(sizeof(Linklist));
for(int i = 1;i < 11;i++)
{
p = (linklist)malloc(sizeof(Linklist));
p -> data = i;
p -> next = (*head) -> next;
(*head) = p;
}
(*head) -> next = NULL;
}