C语言:数据结构之单链表(二)
上一篇随笔谈了谈单链表是什么东西,然后进行了初始化,这篇随笔就开始对其进行操作了,首先是增,删,改,查的增。
增,顾名思义就是要增加新的元素,单链表是链式的,那就要考虑怎么去加新元素,有三种,从头部添加,从尾部添加,从中间添加。先说说从尾部添加,这个比较好理解,直接在尾部放一个结点然后连起来就好了。
1、尾插法,从尾部添加节点。
步骤顺其自然就来了:
①要想添加节点就先新建一个节点,即将成为链表的尾结点。
②找到尾部,也就是当前链表最后一个结点,最后一个节点与别的节点的区别就是它的next是NULL。
③把新建的结点加入到最后一个节点当中,具体操作就是把当前最后一个结点的next指向新建的结点就OK了。=^•ω•^=
void AddLetter_Tail(LinkList header, char letter_) { LinkList p,q = NULL; // Creaat New node q = (LinkList)malloc(sizeof(LNode)); q->letter = letter_; q->next = NULL; //Search tail p = header; while(p->next != NULL) { p = p->next; } // add node p->next = q; }
2、头插法,在头结点后面插入新元素,我们不能把头结点抹去,也不能在头结点前面插入,因为我们链表的第一个节点是头结点。
步骤又自然而然的出来了:
①老规矩,先新建结点。
②找到头部,也就是上一篇随笔里第一次新建的结点,名字叫head。
③改变指针指向,新建结点的next指向首元结点(由原链表head的next得到),然后头结点(也就是head)的next指向新建的结点。
注:第③步顺序可以改变,可以头结点先指向新建结点,新建结点next再指向首元结点,只不过程序上略有不同,需要保存好首元结点的地址也就是原链表head的next,要不然新建结点就找不到指向首元结点的入口了。
void AddLetter_Head(LinkList header,char letter_) { LinkList q,p = NULL; // Creaat New node q = (LinkList)malloc(sizeof(LNode)); q->letter = letter_; q->next = NULL; //add node p = header; q->next = p->next; p->next = q; }
这样就算把头插法和尾插法弄明白了,当添加完元素之后可以先遍历链表看看。
void PrintList(LinkList header) { LinkList p = header->next; while(p != NULL) { printf("%c ",p->letter); p = p->next; } printf("\n"); }
main函数代码如下:
int main() { printf("This is Struct_Data:\n\n"); LinkList head = Init_linklist(); AddLetter_Tail(head,'H'); AddLetter_Tail(head,'i'); AddLetter_Tail(head,','); AddLetter_Tail(head,'L'); AddLetter_Tail(head,'i'); AddLetter_Tail(head,'n'); AddLetter_Tail(head,'u'); AddLetter_Tail(head,'x'); AddLetter_Tail(head,'.'); PrintList(head); AddLetter_Head(head,'/'); AddLetter_Head(head,'U'); AddLetter_Head(head,'b'); AddLetter_Head(head,'u'); AddLetter_Head(head,'n'); AddLetter_Head(head,'t'); AddLetter_Head(head,'u'); AddLetter_Head(head,'.'); PrintList(head); return 0; }
效果如图:
下一篇将谈一谈中间插入元素,和删除操作。
总结: ①在学习新东西的时候一定要想清楚自己在干什么,要有主见的去学习新事物。
②可以画图,写写字儿,理清自己的思路。
③程序不是只能这么写,只要符合逻辑怎么写都行,当时就是太死板,总想着去记住程序。
以上只是本人的理解和所见,如有不同见解和看法,欢迎在评论区批评指正。