1. 程式人生 > >資料結構—連結串列的前插法與後插法

資料結構—連結串列的前插法與後插法

在進行單鏈表的基本運算之前必須先建立單鏈表,建立單鏈表的常用方法有兩種:頭插法建表和尾插法建表

頭插法建表,從一個空表開始,讀取字元陣列a中的字元,生成新節點,將讀取的資料存放到新節點的資料域中,然後將新節點插入到當前連結串列的表頭上,直到讀完字元陣列a的所有元素為止。

頭插法建表雖然簡單,但生成的連結串列中節點的次序和原陣列的次序相反,若希望兩者的次序一致,可採用尾插法建立

尾插法建表,該演算法是將新節點插到當前連結串列的表尾上,為此必須增加一個尾指標r,使其始終指向當前連結串列的尾節點

前插法

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }Node,*LinkedList; LinkedList LinkedListInit() { Node *L; L = (Node *)malloc(sizeof(Node)); if(L == NULL) { printf("申請記憶體空間失敗\n"); } L->next = NULL; return
L; } LinkedList LinkedListCreatH() { Node *L; L = (Node *)malloc(sizeof(Node)); L->next = NULL; ElemType x; while(scanf("%d",&x) != EOF) { Node *p; p = (Node *)malloc(sizeof(Node)); p->
data = x; p->next = L->next; L->next = p; } return L; } LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) { Node *pre; pre = L; int tempi = 0; for (tempi = 1; tempi < i; tempi++) { pre = pre->next; } Node *p; p = (Node *)malloc(sizeof(Node)); p->data = x; p->next = pre->next; pre->next = p; return L; } LinkedList LinkedListDelete(LinkedList L,ElemType x) { Node *p,*pre; p = L->next; pre = L; /************************** 新增上 per = L; 就行了 原因 : 剛開始 per 沒有賦值如果刪除第一個元素 可能造成因為per為空指標的情況下指標失陪的情況 ***************************/ while(p->data != x) { pre = p; p = p->next; } pre->next = p->next; free(p); return L; } int findder(LinkedList L,int x) { //查詢功能 /* * @ x 所要查詢的值 * @ L 所要操作的連結串列 * 返回 -1 時表示連結串列中沒有所在得值 */ LinkedList start; int i = 1; L = L->next; for (start = L;start != NULL;start = start->next) { if ( start->data == x ) { return i; } i++; } return -1; } LinkedList Delete(LinkedList L,int st,int en) { // 多組資料刪除功能 /* * @ st 刪除的起始位置 * @ en 刪除的終止為止 * @ L 所要操作的的連結串列 */ bool flag1 = false; Node *per,*p; per = L; L = L->next; int i = 1; LinkedList start; for (start = L;start != NULL ; start = start->next ) { if ( st == i ) { flag1 = true; } if ( en == i ) { per->next = start->next; break; } i++; if ( !flag1 ) per = start; } return L; } int main() { LinkedList list,start; printf("請輸入單鏈表的資料:"); list = LinkedListCreatH(); for(start = list->next; start != NULL; start = start->next) { printf("%d ",start->data); } printf("\n"); int i; ElemType x; printf("請輸入插入資料的位置:"); scanf("%d",&i); printf("請輸入插入資料的值:"); scanf("%d",&x); LinkedListInsert(list,i,x); for(start = list->next; start != NULL; start = start->next) { printf("%d ",start->data); } printf("\n"); printf("請輸入要刪除的元素的值:"); scanf("%d",&x); LinkedListDelete(list,x); for(start = list->next; start != NULL; start = start->next) { printf("%d ",start->data); } printf("\n"); return 0; }

後插法

#include <stdio.h>
#include <stdlib.h>
 
typedef int ElemType;
 
typedef struct Node {
    ElemType data;               
    struct Node *next;          
}Node,*LinkedList;

LinkedList LinkedListInit() {
    Node *L;
    L = (Node *)malloc(sizeof(Node)); 
    if(L == NULL) { 
        printf("申請記憶體空間失敗\n");
    }
    L->next = NULL;                  
 	return L;
}

void LinkedListCreatH(LinkedList &list) {
    Node *L,*s;
    list = new Node; list->next = NULL;
    L = list; ElemType x;
    while ( ~scanf("%d",&x) ) {
    	s = new Node;	
    	s->data = x; s->next = L->next; L->next = s;
    	L = s;
	}
} 

LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) {
    Node *pre;                     
    pre = L;
    int tempi = 0;
    for (tempi = 1; tempi < i; tempi++) {
    	pre = pre->next;                  
	}
    Node *p;                                
    p = (Node *)malloc(sizeof(Node));
    p->data = x; 
    p->next = pre->next;
    pre->next = p;
     
    return L;                           
} 

LinkedList LinkedListDelete(LinkedList L,ElemType x)
{
    Node *p,*pre;                    
    p = L->next;
    pre = L;
    while(p->data != x) {               
        pre = p; 
        p = p->next;
    }
    pre->next = p->next;          
    free(p);
    return L;
} 

int main() {
    LinkedList list,start;
 	printf("請輸入單鏈表的資料:"); 
   	LinkedListCreatH(list);
	for(start = list->next; start != NULL; start = start->next) {
		printf("%d ",start->data);
	}
	printf("\n");
    int i;
    ElemType x;
    printf("請輸入插入資料的位置:");
    scanf("%d",&i);
    printf("請輸入插入資料的值:");
    scanf("%d",&x);
    LinkedListInsert(list,i,x);
    for(start = list->next; start != NULL; start = start->next) {
    	printf("%d ",start->data);
	}
    printf("\n");
    printf("請輸入要刪除的元素的值:");
    scanf("%d",&x);
    LinkedListDelete(list,x); 
    for(start = list->next; start != NULL; start = start->next) {
    	printf("%d ",start->data);
	}
    printf("\n"); 
    return 0;
}