在進行單鏈表的基本運算之前必須先建立單鏈表,建立單鏈表的常用方法有兩種:頭插法建表和尾插法建表
頭插法建表,從一個空表開始,讀取字符數組a中的字符,生成新節點,將讀取的數據存放到新節點的數據域中,然后將新節點插入到當前鏈表的表頭上,直到讀完字符數組a的所有元素為止。
核心代碼:
s->next = L->next; // 新節點指向開始節點 L-next = s; // 頭結點指向s節點,使s成為開始節點
頭插法建表雖然簡單,但生成的鏈表中節點的次序和原數組的次序相反,若希望兩者的次序一致,可采用尾插法建立
尾插法建表,該算法是將新節點插到當前鏈表的表尾上,為此必須增加一個尾指針r,使其始終指向當前鏈表的尾節點
核心代碼:
r->next=s;//將s插入到r后 r在前面初始化為 r = L r是尾指針 r=s;//使r指向尾結點
實現代碼:
1 #include <cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 6 using namespace std; 7 8 typedef int ElemType; 9 typedef struct LNode{ 10 ElemType data; //存放元素值 11 struct LNode *next;//指針域指向后繼結點 12 }ListNode; 13 14 15 //頭插法建表 16 void CreateListHead(ListNode *&L,ElemType a[],int n){ 17 18 ListNode *s; 19 L=(ListNode *)malloc(sizeof(ListNode));//創建頭結點 20 L->next=NULL; //將頭結點next域置空 21 22 for(int i=0;i<n;i++){ //循環建立數據結點 23 //創建數據結點*s 24 s=(ListNode *)malloc(sizeof(ListNode)); 25 26 //將結點s插在原開始節點之前,頭結點之后 27 s->data=a[i]; 28 s->next=L->next; 29 L->next=s; 30 } 31 } 32 33 //尾插法建表 34 void CreateListTail(ListNode *&L,ElemType a[],int n){ 35 ListNode *s,*r; 36 L=(ListNode *)malloc(sizeof(ListNode));//創建頭結點 37 L->next = NULL; //將頭結點next域置空 38 r=L;//r始終指向尾結點,開始時頭結點和尾結點是同一個 39 40 for(int i=0;i<n;i++){ 41 s=(ListNode *)malloc(sizeof(ListNode));//創建數據結點 42 43 s->data=a[i];//數據域 44 r->next=s;//將s插入到r后 45 r=s;//使r指向尾結點 46 } 47 48 r->next=NULL;//尾指針指針域置空 49 50 } 51 //輸出 52 void DispList(ListNode *L){ 53 ListNode *p=L->next;//p指向開始結點 54 55 while(p!=NULL) 56 { 57 cout<<p->data<<" "; //輸出數據域 58 p=p->next; 59 } 60 cout<<endl; 61 } 62 int main(){ 63 ListNode *L; 64 int n; 65 cout<<"n:"; 66 cin>>n; 67 68 int *a=new int(n); 69 for(int i=0;i<n;i++){ 70 cin>>a[i]; 71 } 72 //頭插法建表 73 CreateListHead(L,a,n); 74 cout<<"頭插法建表:"; 75 DispList(L);//輸出 76 77 //尾插法建表 78 CreateListTail(L,a,n); 79 cout<<"尾插法建表:"; 80 DispList(L);//輸出 81 }
參考: