链表的建立,搜索,插入,反转,销毁以及合并有序链表。
-創(chuàng)建,插入,反轉(zhuǎn)鏈表-
? /*關(guān)于鏈表的一系列操作*/ #include <stdio.h> #include <stdlib.h> typedef struct node{int data;struct node *next;}Node,*linklist;int main(){//創(chuàng)建鏈表,賦值 (頭插法) linklist head = (linklist)malloc(sizeof(Node));//head 頭結(jié)點(diǎn) linklist p = (linklist )malloc(sizeof(linklist ));//p 工具節(jié)點(diǎn) head -> next = NULL;int n;printf ("輸入要建立的鏈表長度:\n");scanf ("%d", &n);printf ("要輸入的數(shù)字們:\n");while((n--) > 0){linklist p = (linklist )malloc(sizeof(linklist ));scanf("%d", &p -> data);p -> next = head -> next;head -> next = p;}//打印鏈表printf("\n生成的鏈表:\n");p = head -> next;while(p){printf("%-5d",p -> data);p = p -> next;}//在第n個(gè)位置插入數(shù)字 xprintf("\n*接下來插入一個(gè)數(shù)字* \n\n要在第幾個(gè)位置插入數(shù)字:\n");scanf("%d", &n);int x;printf("插入的數(shù)字:\n");scanf("%d", &x);p = head;linklist pre = (linklist )malloc(sizeof(linklist ));//pre 標(biāo)記目標(biāo)結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn) n--;while(n!=0){p = p -> next;n--;}pre = p;linklist s = (linklist )malloc(sizeof(linklist ));//s 儲存目標(biāo)數(shù)字 s -> data = x;s -> next = pre -> next;pre -> next = s;//打印鏈表printf("\n插入后的新鏈表:\n");p = head -> next;while(p){printf("%-5d",p -> data);p = p -> next;}//三指針法反轉(zhuǎn)這個(gè)鏈表pre = NULL;//指針1 linklist cur = (linklist )malloc(sizeof(linklist ));//指針2cur = head -> next;while(cur){linklist next = (linklist )malloc(sizeof(linklist ));//指針3next = cur -> next;cur -> next = pre;pre = cur;cur = next;}head -> next = pre;printf("\n\n反轉(zhuǎn)鏈表 結(jié)果是:\n");//打印鏈表p = head -> next;while(p){printf("%-5d",p -> data);p = p -> next;} }?? ? ? ? 對于頭插法和尾插法:鏈表尾插法是從鏈表頭開始賦值,頭插法則是從鏈表尾開始賦值。如對于一個(gè)長度為5的鏈表,輸入1,2,3,4,5,尾插法打印出來的是1,2,3,4,5,頭插法打印出來就是5,4,3,2,1。在建立時(shí),頭插法相對于尾插法可以少定義一個(gè)變量,個(gè)人覺得更方便一些。
? ? ? ? 對于鏈表的查找與插入:找到目標(biāo)結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)再進(jìn)行操作即可,注意使用一個(gè)指針來記錄目標(biāo)結(jié)點(diǎn)防止丟失鏈表。
? ? ? ? 對于反轉(zhuǎn)鏈表:這里使用三指針法反轉(zhuǎn)鏈表。指針cur為操作指針,負(fù)責(zé)反轉(zhuǎn)每個(gè)結(jié)點(diǎn),指針pre記錄前一結(jié)點(diǎn),用于給操作指針定位。指針next記錄后一結(jié)點(diǎn),給操作指針引路(記錄下一結(jié)點(diǎn))。每次反轉(zhuǎn)一個(gè)結(jié)點(diǎn)就讓三個(gè)指針都后移一位。
? ? ? ? 這里有個(gè)點(diǎn)要注意,就是控制循環(huán)終止的條件為while(cur)而不是while(pre)或while(next)。因?yàn)閚ext總是先與cur一個(gè)結(jié)點(diǎn),用next來控制會導(dǎo)致最后一個(gè)結(jié)點(diǎn)沒有反轉(zhuǎn)。
?-合并有序鏈表,及銷毀-
#include <stdio.h> #include <stdlib.h> typedef struct node{int data;struct node *next;}Node,*linklist;//尾插法創(chuàng)建鏈表 void CreatTail(linklist head) {Node *p,*s;p = head;int n;printf("要輸入幾個(gè)數(shù)字:\n"); scanf("%d",&n);printf("輸入你要輸入的數(shù)字們 (從小到大):\n");while(n>0){s = (Node *)malloc(sizeof(Node));scanf("%d",&s->data);s -> next = NULL;p -> next = s;p = s; n--;}printf("\n"); } int main(){//合并有序鏈表printf("\n\n*接下來合并有序鏈表*\n\n輸入兩個(gè)有序鏈表:\n"); linklist head1 = (linklist)malloc(sizeof(Node));linklist head2 = (linklist)malloc(sizeof(Node));linklist head3 = (linklist)malloc(sizeof(Node));printf("\n*定義鏈表1*\n"); CreatTail(head1); printf("\n*定義鏈表2*\n"); CreatTail(head2);linklist p1 = head1 -> next;linklist p2 = head2 -> next;linklist p3;if(p1 -> data < p2 -> data){head3 = p1;p1 = p1 -> next;}else{head3 = p2;p2 = p2 -> next;}p3 = head3;//此時(shí)head3直接指向第一個(gè)結(jié)點(diǎn)。 while(p1&&p2){if(p1 -> data <= p2 -> data){p3 -> next = p1;p3 = p1;p1 = p1 -> next;}else{p3 -> next = p2;p3 = p2;p2 = p2 -> next;}}if(p1!=NULL){p3 -> next = p1;}else{p2 -> next = p2;}//打印新鏈表printf("合成的新鏈表:\n"); p = head3;while(p){printf("%-5d",p -> data);p = p -> next;}//銷毀鏈表p = head3;linklist q = p;while(p){p = p -> next;free(q);q = p;}head3 -> next = NULL; }? ? ? ? 對于合并有序鏈表:基本思路就是另設(shè)一個(gè)頭結(jié)點(diǎn),再設(shè)兩個(gè)標(biāo)記指針p1和p2來遍歷,引導(dǎo)合并待合并鏈表。當(dāng)其中一個(gè)指針為空時(shí),說明有一個(gè)鏈表已全部合并,說明另一個(gè)鏈表剩下的數(shù)都是更大的數(shù),接下來讓p指向另一個(gè)鏈表就行。
總結(jié)
以上是生活随笔為你收集整理的链表的建立,搜索,插入,反转,销毁以及合并有序链表。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录四个字符串函数
- 下一篇: 判断回文链表(剑指offer.027)