實現單鏈表各種基本運算的演算法
阿新 • • 發佈:2019-02-20
編寫一個頭檔案LinkList.h,實現單鏈表的各種基本運算,並在此基礎上設計一個主程式(exp2_2.cpp)完成如下功能:
- 初始化單鏈表h
- 依次採用尾插法插入a,b,c,d,e元素
- 輸出單鏈表h
- 輸出單鏈表h的長度
- 判斷單鏈表h是否為空
- 輸出單鏈表h的第3個元素
- 輸出元素a的位置
- 在第4個元素位置上插入f元素
- 輸出單鏈表h
- 刪除h的第3個元素
- 輸出單鏈表h
- 釋放單鏈表h
標頭檔案:
/*檔名:LinkList.h*/ # include<stdio.h> # include<malloc.h> # include<stdlib.h> # define TRUE 1 # define FALSE 0 # define OK 1 # define ERROR 0 # define INFEASIBLE -1 # define OVERFLOW -2 typedef int Status; typedef char ElemType; //定義單鏈表的儲存結構 typedef struct LNode { ElemType date; struct LNode *next; }LNode , *LinkList; //構造一個單鏈表 Status InitList(LinkList &L) { L=(LinkList)malloc(sizeof(LNode));//生成結點 if(!L) { return OVERFLOW; } L->next = NULL; return OK; } //銷燬單鏈表 Status DestroyList(LinkList &L) { LinkList q = L; while(q != NULL) { LinkList p = q; q = q->next; free(p); p = NULL; } return OK; } //判斷是否為空,為空返回ture,否則返回false Status ListEmpty(LinkList L) { if(!L->next)//為空 { return TRUE; } else return FALSE; } //返回單鏈表的長度 Status ListLength(LinkList L) { int i = 0; LNode * p; p = L->next; while(p != NULL) { i++; p = p->next; } return i; } //列印單鏈表中的元素 void DispList(LinkList &L) { LinkList p; p = L->next; while(p != NULL) { printf("%c" , p->date); p = p->next; } printf("\n"); } //從單鏈表L中查詢第i個元素,由引數e返回其元素的值 Status GetElem(LinkList L , int i , ElemType &e) { int j = 1; struct LNode *p = L->next; while(p && j<i) { p = p->next; ++j; } if(!p || j>i) //第i個元素不存在 { return ERROR; } e = p->date; //取第i個元素 return OK; } //在單鏈表L中查詢元素e的位置,不存在則返回0 Status LocateElem(LinkList L, ElemType e) { int i = 0; LinkList p = L->next; while (p) { i++; if (p->date == e) { return i; } p = p->next; } return 0; } //在單鏈表L中第i個位置之前插入元素e Status ListInsert(LinkList &L, int i, ElemType e) { int j = 0; LinkList p = L, s; while (p && j<i-1) { p = p->next; ++j; } if (!p || j>i-1) { return ERROR; } s = (LinkList)malloc(sizeof(LNode));//生成新節點 s->date = e; s->next = p->next; //把所有元素向後移一位 p->next = s; return OK; } //單鏈表L中刪除第i個元素,並由e返回其值 Status ListDelete(LinkList &L, int i, ElemType &e) { int j = 0; LinkList p = L, q; while (p->next && j<i-1) { p = p->next; ++j; } if (!(p->next) || j>i-1) { return ERROR; } q = p->next; p->next = q->next; e = q->date; free(q); return OK; }
主函式:
#include "LinkList.h" int main() { int l; LinkList(L); ElemType e; printf("初始單鏈表L\n"); InitList(L); printf("依次採用尾插法插入a , b , c , d , e元素\n"); ListInsert(L , 1 , 'a'); ListInsert(L , 2 , 'b'); ListInsert(L , 3 , 'c'); ListInsert(L , 4 , 'd'); ListInsert(L , 5 , 'e'); printf("輸出單鏈表L:"); DispList(L); l=ListLength(L); printf("單鏈表長度l=%d\n" , l); printf("單鏈表L為%s\n" , (ListEmpty(L)?"空":"非空")); GetElem(L , 3 , e); printf("單鏈表的第3個元素=%c\n" , e); printf ("元素a的位置=%d\n" , LocateElem(L , 'a')); printf("在第4個元素位置上插入f元素\n"); ListInsert(L , 4 , 'f'); printf("單鏈順序表L:"); DispList(L); printf("刪除L的第3個元素\n"); ListDelete(L , 3 , e); printf("輸出單鏈表L:"); DispList(L); printf("釋放單鏈表L\n"); free(L); return 0; }
結果: