連結串列的基本運算,插入,刪除和輸出
阿新 • • 發佈:2019-01-03
【問題描述】
設計並實現線性表的單鏈表儲存和運算。
【基本要求】
實現單鏈表的插入、刪除和遍歷運算,每種操作用一個函式實現。 插入操作:將一個新元素插入表中指定序號的位置。 刪除操作:將指定序號的元素從表中刪除。 遍歷操作:從表頭按次序輸出所有元素的值,若是空表,則輸出資訊“empty list!”。
【實現提示】
- 程式執行時,首先在 main 函式中建立空的、帶頭結點的單鏈表。然後多次呼叫實現插入操作的函式(每次都將元素在序號 1 位置上插入),將元素依次插入表中,最後呼叫實現遍歷操作的函式輸出所有元素。之後再多次呼叫實現刪除操作的函式將表還原為空表(每次都刪除第 1 個元素,每刪除 一個元素後,將表中剩餘元素都輸出一次)。
- 單鏈表結點型別定義:
- typedef int ElemType; //為簡化起見,元素型別定義為整型
- typedef struct Node{
ElemType data; struct Node *next;
}Node, *LinkList;
5.為了簡化指標引數傳遞,使用 c++的引用引數,儲存源程式時注意字尾名應為 cpp。 (其他實 驗題目在此處的處理相同)
6.建立連結串列時,可以多次呼叫插入函式(插入函式的功能是在連結串列的第 i 個元素結點前插入一個 新結點),通過不斷地在連結串列中增加結點來實現,也可以定義一個專門建立連結串列的函式,呼叫一次該函 數就完成連結串列中所有結點的建立(當然,此後需要在連結串列中插入一個新結點時呼叫前述的插入函式即 可)。
/**************** 連結串列的基本運算*** 插入刪除和輸出*** by涼柒_lq *** ****************/ #include<stdio.h> #include<stdlib.h> typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode* next; }LNode; typedef LNode* Linklist; typedef int Status; #define overflow -2 #define true 1 #define false 0 #define ok 1 #define error 0 /*表頭插入法*/ Status Createlist(Linklist &L, int n) { int i; Linklist p; Status ListTravel(Linklist &L); L = (Linklist)malloc(sizeof(LNode)); if (!L) exit(overflow); L->next = NULL; for (i = n; i>0; i--) { p = (Linklist)malloc(sizeof(LNode)); if (!p) exit(overflow); scanf("%d", &p->data); p->next = L->next; L->next = p; } printf("\n"); ListTravel(L); return ok; } /*空表判斷函式*/ /*連結串列存在且只有頭結點*/ Status ListEmpty(Linklist &L) { if (L != NULL && L->next == NULL) { printf("empty list!\n"); return true; } else return false; } /*頭結點刪除函式*/ Status Topdellist(Linklist &L) { Status Listlength(Linklist &L); Status ListTravel(Linklist &L); int j; Linklist p; int b = Listlength(L); for (j = 0; j<b; j++) { p = L; p = p->next; L->next = p->next; free(p); ListTravel(L); } if(ListEmpty(L)) return ok; } /*連結串列長度函式*/ Status Listlength(Linklist &L) { Linklist p; int i; if (L) { i = 0; p = L->next; while (p) { i++; p = p->next; } } return i; } /*遍歷並輸出,呼叫visit函式*/ Status ListTravel(Linklist &L) { void Visit(Linklist &p); Linklist p; if (!L) return 0; else p = L->next; while (p) { Visit(p); p = p->next; } if(L->next!=NULL) printf("\n\n"); return ok; } /*visit函式*/ void Visit(Linklist &p) { printf("%d ",p->data); } /*主函式*/ int main() { Linklist L; Createlist(L, 5); Topdellist(L); return 0; }
執行結果截圖:
程式碼不難,細看就可以看懂,明天會更新第二種方法。
原創,轉載註明出處。