線性表操作(增刪改查清空)
阿新 • • 發佈:2018-12-21
頭插法建立連結串列
程式碼
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int Status; typedef int ElemType; typedef struct Lnode { ElemType data; struct Lnode *next; } Lnode; //頭插法 Lnode *create_LinkList() { int data; Lnode *head; Lnode *p; head = (Lnode*)malloc(sizeof(Lnode)); head->next = NULL; printf("輸入要插入的數字, 當輸入-1時 插入結束\n"); while(1) { scanf("%d", &data); if(data == -1) break; p = (Lnode*)malloc(sizeof(Lnode)); p->data = data; p->next = head->next; head->next = p; } return (head); } //查詢 i 處的值 ElemType Get_Elem(Lnode *L, int i) { int j; Lnode *p; p = L->next; j = 1; while(p != NULL && j < i) { p = p->next; j++; } if(j!=i) return (-1); else return (p->data); } //查詢值為key的節點 Status Locate_Node(Lnode *L, ElemType key) { int i = 1; Lnode *p = L->next; while(p) { if(p->data == key) return i; i++; p = p->next; } if(!p) return ERROR; return OK; } //插入e值 在i位置處 Status Insert_Lnode(Lnode *L, int i, ElemType e) { int j = 0; Lnode *p, *pos; Lnode *q; p = L->next; pos = (Lnode*)malloc(sizeof(Lnode)); while(p != NULL && j < i-1) { pos = p; p = p->next; j++; } if(!p) { printf("i值不符合\n"); } else { q = (Lnode*)malloc(sizeof(Lnode)); q->data = e; pos->next = q; q->next = p; } return OK; } //刪除i處的值 用E返回其值 Status Delete_LinkList1(Lnode *L, int i, ElemType *e) { int j = 1; Lnode *p; Lnode *q; p = L; q = L->next; while(p->next != NULL && j < i) { p = q; q = q->next; j++; } if(j != i) printf("i值不符合\n"); else { p->next = q->next; *e = q->data; free(q); } return OK; } //刪除值為key的結點 void Delete_LinkList2(Lnode*L, int key) { Lnode * p = L; while(p->next!=NULL){ if(p->next->data == key){ p->next = p->next->next; } p = p->next; } } //刪除單鏈表中所有值相同的結點 void Delete_LinkList3(Lnode *L) { Lnode *p = L->next; Lnode *q; Lnode *ptr; while(p != NULL) { q = p; ptr = p->next; while(ptr != NULL) { if(ptr->data == p->data) { q->next = ptr->next; free(ptr); ptr = q->next; } else { q = ptr; ptr = ptr->next; } } p = p->next; } } //輸出 Status Traverse_LinkList(Lnode *L) { Lnode *p; p = L->next; while(p) { printf("%d\t",p->data); p = p->next; } printf("\n"); return OK; } //求長度 int LinkList_Length(Lnode *L) { int count = 0; Lnode *p=L->next; while(p) { count++; p=p->next; } return count; } //清空連結串列 Status clear_List(Lnode *L) { Lnode *p = L->next; Lnode *q; while(p) { q = p->next; free(p); p = q; } L->next = NULL; return OK; } Status ListEmpty(Lnode *L) { Lnode *p = L->next; if(!p) return OK; else return ERROR; } int main() { ElemType i, res, key, e; Lnode *La = (Lnode*)malloc(sizeof(Lnode)); if(!La) return ERROR; printf("頭插入法建立La:\n"); La = create_LinkList(); printf("列印新建立的La:\n"); Traverse_LinkList(La); printf("La的長度為:%d\n", LinkList_Length(La)); printf("輸入想要查詢的位置:"); scanf("%d", &i); res = Get_Elem(La, i); printf("查詢的值為:%d\n", res); printf("輸入想要查詢的值:"); scanf("%d", &key); res = Locate_Node(La, key); printf("該值的位置是:%d\n", res); printf("輸入插入的值:"); scanf("%d", &key); printf("輸入要插入的位置:"); scanf("%d", &i); Insert_Lnode(La, i, key); printf("連結串列為:\n"); Traverse_LinkList(La); printf("輸入要刪除的位置:"); scanf("%d", &i); Delete_LinkList1(La, i, &e); printf("刪除的值為:%d", e); printf("連結串列為:\n"); Traverse_LinkList(La); printf("\n"); printf("輸入要刪除的值:"); scanf("%d", &key); Delete_LinkList2(La, key); printf("連結串列為:\n"); Traverse_LinkList(La); Delete_LinkList3(La); printf("刪除相同結點後的鏈式表:\n"); Traverse_LinkList(La); printf("此時連結串列長度為 %d\n", LinkList_Length(La)); i = ListEmpty(La); printf("La是否為空: i=%d(1:是 -1:否)\n",i); printf("清空La\n"); clear_List(La); i = ListEmpty(La); printf("La是否為空: i=%d(1:是 -1:否)\n",i); return 0; }
結果展示