頭插法:
頭插法圖解:
解釋:頭插法顧名思義就是在頭結點的后面增加結點。
首先創建一個帶頭結點的空的單鏈表head
其次按照線性表中元素的逆序依次讀入數據元素,如果不是結束標志時,申請結點s,將s結點插入到頭結點之后。如上圖b。
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int elemtype; typedef struct node { elemtype data; struct node *next; }LNode *LinkList; LinkList CreatFromHead() { LinkList head; LNode *s; char c; int flag = 1;/*設置一個標識變量flag,初值為1,當輸入“$”時,將flag置位0,建表結束*/ head = (LinkList)malloc(sizeof(LNode)); head->next = NULL; while(flag) { c = getchar(); if(c!='$') { s = (LinkList)malloc(sizeof(LNode)); s->data = c; s->next = head->next;/*將s插入到鏈表中第一個數據元素之前*/ head->next = s; } else flag = 0;/*讀入的符號為"$",修改結束標識*/ } return head; }
尾插法:
尾插法圖解:
解釋:頭插法讀入的數據元素的順序與生成的鏈表中數據元素的順序是相反的。所以用尾插法就可以很好解決這個問題。因為每次都必須將新結點插入到鏈表的尾部,所以需要加入一個尾指針r,用來始終指向鏈表的尾結點,以便能夠將新結點插入到鏈表的尾部。
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int elemtype; typedef struct node { elemtype data; struct node *next; }LNode *LinkList; LinkList CreatTailHead() { LinkList L; LNode *s; char c; int flag = 1;/*設置一個標識變量flag,初值為1,當輸入“$”時,將flag置位0,建表結束*/ L = (LinkList)malloc(sizeof(LNode)); //為頭結點分配空間 L->next = NULL; //建帶頭結點的空鏈表 r = L; //尾指針r指向表尾 while(flag) { c = getchar(); if(c!='$') { s = (LinkList)malloc(sizeof(LNode)); s->data = c; r-next = s; //插入到表尾 r = s; } else { flag = 0; r-next = NULL; } } return L; }