大话数据结构02 :线性表链式存储 C++
生活随笔
收集整理的這篇文章主要介紹了
大话数据结构02 :线性表链式存储 C++
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、鏈表插入和刪除等操作
關鍵是要找到插入元素的前一個元素 Status ListInsert(LinkList L, int i, ElemType e) {LinkList N = new Node();N->data = e;int j = 1;LinkList p = L;while ((j < i )&&(p)){p = p->next;j++;}if (!p)return ERROR; // 沒有這么長的表N->next = p->next; //后繼給Np->next = N; // N作為新的后繼 }2 、完整代碼
#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 *LinkList; /* 定義LinkList *///初始化順序線性表 Status InitList(LinkList *L) {*L = new Node();(*L)->next = NULL;return OK; }// 判斷鏈表是否為空 Status ListEmpty(LinkList L) {if (L->next)return FALSE;elsereturn TRUE; }//將L重置為空表 Status ClearList(LinkList *L) {LinkList p, q;p = (*L)->next;while (p){q = p->next;delete p;p = q;}(*L)->next = NULL;return OK; }//返回L中的元素個數 int ListLength(LinkList L) {int i = 0;LinkList p = L->next;while (p){i++;p = p->next;}return i; }// 用e返回L中第i個元素的值Status GetElem(LinkList L, int i, ElemType* e) {int j = 1;LinkList p;p = L->next;while (p && j < i){p = p->next;j++;}if (!p || j > i)return ERROR;*e = p->data;return OK; }// 尋找第 1個 與e滿足關系的數據元素的位置 int LocateElem(LinkList L, ElemType e) {int i = 0;LinkList p = L->next;while (p){i++;if (p->data == e)return i;p = p->next;}return 0; //沒有這個元素 }//在第i個位置中插入新的數據元素 //鏈表插入 關鍵是找要插入的位置的前一個位置的元素 Status ListInsert(LinkList *L, int i, ElemType e) {LinkList N = new Node();N->data = e;int j = 1;LinkList p = *L;while ((j < i )&&(p)){p = p->next;j++;}if (!p)return ERROR; // 沒有這么長的表N->next = p->next; //后繼給Np->next = N; // N作為新的后繼 }//刪除L的第i個元素 并用e返回其值Status ListDelete(LinkList *L, int i, ElemType* e) {int j = 1;LinkList p = (*L);LinkList q;while ((p->next) && (j < i)){p = p->next;j++;}if (!p->next)return ERROR; // 沒有這個元素*e = p->next->data;q = p->next; //要釋放的元素p->next = p->next->next; //將釋放元素的后繼連接到前面delete q;return OK; }//依次輸出L的每個數據元素Status ListTraverse(LinkList L) {LinkList p = L->next;while (p){visit(p->data);p = p->next;}printf("\n");return OK; }//隨機產生n個元素的值,建立帶表頭節點的單鏈線性表 L(尾插法) void CreateListTail(LinkList *L, int n) {//生成1-10 數字并且存入到鏈表中LinkList p = *L;for (int i = 0; i < n; i++){Node* N = new Node();N->data = i;p->next = N; //將新的數據加入到尾巴p = p->next; //當前指針往后走一步p->next = NULL; //表示當前鏈表結束} }//隨機產生n個元素的值,建立帶表頭節點的單鏈線性表 L(頭插法) void CreateListHead(LinkList *L, int n) {//生成1-10 數字并且存入到鏈表中LinkList 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() {LinkList 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后:L.data=");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);}總結
以上是生活随笔為你收集整理的大话数据结构02 :线性表链式存储 C++的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机基础:进程
- 下一篇: 大话数据结构08:共享栈 C++