C語言單鏈表操作
阿新 • • 發佈:2021-10-16
我亦無他,惟手熟爾#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <stdbool.h> typedef int ElemType; typedef struct Lnode{ ElemType data; struct Lnode * next; }LNode, * LinkList; /* 連結串列初始化 */ void InitList_L(LinkList L){ L = (LinkList)malloc(sizeof(LNode)); if(L == NULL)exit(-1); L->next = NULL; } /* 判斷連結串列是否為空 */ bool ListEmpty(LinkList L){ if(L->next == NULL) return true; return false; } /* 銷燬單鏈表 */ void DestoryList_L(LinkList L){ LinkList p; while(L){ p = L; L = L->next; free(p); } } /* 清空單鏈表 */ void ClearList_L(LinkList L){ LinkList p, q; p = L->next; while(p){ q = p->next; free(p); p = q; } L->next = NULL; } /* 求單鏈表L的長度 */ int ListLength_L(LinkList L){ int len = 0; LinkList p; p = L->next; while(p){ p = p->next; len++; } return len; } /* 取值:取單鏈表中第i個元素的內容 */ int GetElem_L(LinkList L, int i, ElemType * e){ LinkList p; p = L->next; int j = 1; while(p && i > j){ p = p->next; j++; } if(!p || j > i ) return -1; *e = p->data; return 1; } /* 查詢:按值查詢:根據指定資料獲取資料所在位置(地址) */ LinkList LocateElem_L(LinkList L, ElemType e){ LinkList p; p = L->next; while(p && p->data != e){ p = p->next; } return p; } /* 查詢:按值查詢:根據指定資料獲取資料所在位置(序號) */ int LocateElem_L2(LinkList L, ElemType e){ LinkList p; p = L->next; int j = 1; while(p && p->data != e){ p = p->next; j++; } if(p)return j; else return 0; } /* 插入:在第i後結點插入新結點 */ int ListInsert_L(LinkList L, int i, ElemType e){ LinkList p; p = L; int j = 0; while(p && i-1 > j){ p = p->next; j++; } if(!p || j > i - 1) return -1; LinkList s = (LinkList)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return 1; } /* 單鏈表的建立:頭插法 */ LinkList CreateList_H(){ int len; int val; LinkList L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; printf("請輸入您要生成的連結串列節點個數:len="); scanf("%d", &len); int i; for(i = 0; i < len; i++){ printf("請輸入第%d個節點的值:", i + 1); scanf("%d", &val); LinkList p = (LinkList)malloc(sizeof(LNode)); p->data = val; p->next = L->next; L->next = p; } return L; } /* 單鏈表的建立:尾插法 */ LinkList CreateList_R(){ LinkList L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; int len; printf("請輸入您要生成的連結串列節點個數:len="); scanf("%d", &len); int i; LinkList r = L; int val; for(i = 0; i < len; i++){ printf("請輸入第%d個節點的值:", i + 1); scanf("%d", &val); LinkList p = (LinkList)malloc(sizeof(LNode)); p->data = val; p->next = NULL; r->next = p; r = p; } return L; } /* 刪除:刪除第i個結點 */ int ListDelete_L(LinkList L, int i, ElemType * e){ LinkList p; p = L; int j = 0; while(p && j < i - 1){ p = p->next; j++; } if(!p || j > i - 1) return -1; LinkList q; q = p->next; p->next = q->next; *e = q->data; free(q); return 1; } /* 連結串列的遍歷 */ void traverse_list(LinkList L){ LinkList p; p = L->next; while(p){ printf("%d ", p->data); p = p->next; } printf("\n"); return; } int main(){ LinkList L; /***************頭插法建立連結串列*************************/ //L = CreateList_H(); /***************尾插法建立連結串列*************************/ L = CreateList_R(); /***************銷燬單鏈表*************************/ //DestoryList_L(L); /***************清空單鏈表 *************************/ //ClearList_L(L); /***************求單鏈表的長度*************************/ //printf("表長為:%d\n", ListLength_L(L)); /*****取值:取單鏈表中第i個元素的內容,取到的放到e中 ****/ /* ElemType e; GetElem_L(L, 3, &e); printf("e = %d\n", e); */ /*****查詢:按值查詢:根據指定資料獲取資料所在位置(地址)****/ //LocateElem_L(L, 3); /*****查詢:按值查詢:根據指定資料獲取資料所在位置(序號)****/ //printf("Locate = %d", LocateElem_L2(L, 45)); /***************求插入:在第i後結點前插入新結點***********************/ //printf("-----before------\n"); //traverse_list(L); //ListInsert_L(L, 4, 999);//i等於0在第i之後插入,i等於1在i之前插入 //printf("-----after------\n"); //traverse_list(L); // -----before------ // 23 43 56 67 87 // -----after------ // 23 43 56 999 67 87 //printf("ListEmpty = %d", ListEmpty(L)); //判斷單鏈表是否為空 int e; ListDelete_L(L, 3, &e); traverse_list(L); return 0; }