大话数据结构04:循环链表
生活随笔
收集整理的這篇文章主要介紹了
大话数据结构04:循环链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、頭指針法
#include "stdio.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0#define MAXSIZE 20 /* 存儲空間初始分配量 */typedef int Status;/* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */ typedef int ElemType;/* ElemType類型根據實際情況而定,這里假設為int */Status visit(ElemType c) {printf("%d ", c);return OK; }typedef struct Node {ElemType data;struct Node* next; }Node;typedef struct Node* LinkLoopList; /* 定義LinkList *///初始化順序線性表 Status InitList(LinkLoopList* L) {*L = new Node();(*L)->next = (*L); //將next指向頭指針 由于是空的所以 頭指針等于尾指針return OK; }// 判斷鏈表是否為空 Status ListEmpty(const LinkLoopList *L) {if ((*L)->next != (*L))return FALSE;elsereturn TRUE; }//將L重置為空表 Status ClearList(LinkLoopList* L) {LinkLoopList p, q;p = (*L)->next;while (p != (*L)){q = p->next;delete p;p = q;}(*L)->next = (*L);return OK; }//返回L中的元素個數 const int ListLength( LinkLoopList *L) {int i = 0;LinkLoopList p = (*L)->next;while (p != (*L)){i++;p = p->next;}return i; }// 用e返回L中第i個元素的值Status GetElem(LinkLoopList *L, int i, ElemType* e) {int j = 1;LinkLoopList p;p = (*L)->next;while ((p != (*L)) && j < i){p = p->next;j++;}if ((p == (*L)) || j > i)return ERROR;*e = p->data;return OK; }// 尋找第 1個 與e滿足關系的數據元素的位置 int LocateElem(LinkLoopList *L, ElemType e) {int i = 0;LinkLoopList p = (*L)->next;while (p != (*L)){i++;if (p->data == e)return i;p = p->next;}return 0; //沒有這個元素 }//在第i個位置中插入新的數據元素 //鏈表插入 關鍵是找要插入的位置的前一個位置的元素 Status ListInsert(LinkLoopList* L, int i, ElemType e) {LinkLoopList N = new Node();N->data = e;int j = 1;LinkLoopList p = *L;while ((j < i) && (p->next != (*L))){p = p->next;j++;}if ((j < i) && (!(p != (*L))))return ERROR; // 沒有這么長的表N->next = p->next; //后繼給Np->next = N; // N作為新的后繼 }//刪除L的第i個元素 并用e返回其值Status ListDelete(LinkLoopList* L, int i, ElemType* e) {int j = 1;LinkLoopList p = (*L);LinkLoopList q;while ((p->next != (*L)) && (j < i)){p = p->next;j++;}if (!(p->next != (*L)) )return ERROR; // 沒有這個元素*e = p->next->data;q = p->next; //要釋放的元素p->next = p->next->next; //將釋放元素的后繼連接到前面delete q;return OK; }//依次輸出L的每個數據元素const Status ListTraverse(LinkLoopList *L) {LinkLoopList p = (*L)->next;while (p != (*L)){visit(p->data);p = p->next;}printf("\n");return OK; }//隨機產生n個元素的值,建立帶表頭節點的單鏈線性表 L(尾插法) void CreateListTail(LinkLoopList* L, int n) {//生成1-10 數字并且存入到鏈表中LinkLoopList p = *L;for (int i = 0; i < n; i++){Node* N = new Node();N->data = i;p->next = N; //將新的數據加入到尾巴p = p->next; //當前指針往后走一步p->next = *L; //表示當前鏈表結束} }//隨機產生n個元素的值,建立帶表頭節點的單鏈線性表 L(頭插法) void CreateListHead(LinkLoopList* L, int n) {//生成1-10 數字并且存入到鏈表中LinkLoopList p = (*L)->next;for (int i = 0; i < n; i++){Node* N = new Node();N->data = i;N->next = p; //將第一個指針放到后面(*L)->next = N; //新的第一個元素p = N; //表頭指針} }int main() {LinkLoopList L = NULL;ElemType e;Status i;int j;int k;i = InitList(&L);printf("初始化后:ListLength(L) = %d \n", ListLength(&L));for (int j = 1; j <= 5; j++){int i = ListInsert(&L, 1, j);}printf("在L的表頭依次插入1~5后:ListLength(L) = %d \n", ListLength(&L));ListTraverse(&L);printf("ListLength(L)=%d \n", ListLength(&L));i = ListEmpty(&L);printf("L是否空:i=%d(1:是 0:否)\n", i);i = ClearList(&L);printf("清空L后:ListLength(L)=%d\n", ListLength(&L));i = ListEmpty(&L);printf("L是否空:i=%d(1:是 0:否)\n", i);for (int j = 1; j <= 10; j++)ListInsert(&L, j, j);printf("在L的表尾依次插入1~10后:L.data=");ListTraverse(&L);printf("ListLength(L)=%d \n", ListLength(&L));ListInsert(&L, 1, 0);printf("在L的表頭插入0后:L.data=");ListTraverse(&L);printf("ListLength(L)=%d \n", ListLength(&L));GetElem(&L, 5, &e);printf("第5個元素的值為:%d\n", e);for (int j = 3; j <= 4; j++){k = LocateElem(&L, j);if (k)printf("第%d個元素的值為%d\n", k, j);elseprintf("沒有值為%d的元素\n", j);}k = ListLength(&L); /* k為表長 */for (int j = k + 1; j >= k; j--){i = ListDelete(&L, j, &e); /* 刪除第j個數據 */if (i == ERROR)printf("刪除第%d個數據失敗\n", j);elseprintf("刪除第%d個的元素值為:%d\n", j, e);}printf("依次輸出L的元素:");ListTraverse(&L);j = 5;ListDelete(&L, j, &e); /* 刪除第5個數據 */printf("刪除第%d個的元素值為:%d\n", j, e);printf("依次輸出L的元素:");ListTraverse(&L);i = ClearList(&L);printf("\n清空L后:ListLength(L)=%d\n", ListLength(&L));CreateListHead(&L, 20);printf("整體創建L的元素(頭插法):");ListTraverse(&L);i = ClearList(&L);printf("\n刪除L后:ListLength(L)=%d\n", ListLength(&L));CreateListTail(&L, 20);printf("整體創建L的元素(尾插法):");ListTraverse(&L);}總結
以上是生活随笔為你收集整理的大话数据结构04:循环链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大话数据结构03:静态链表
- 下一篇: 大话数据结构05: 双向链表