鏈表的類C實現:
lklist.h:
/* * lklist.h */ #ifndef LKLIST_H_ #define LKLIST_H_ #define OK 1 #define ERROR -1 typedef int ElemType; typedef struct lknode { ElemType data; struct lknode *next; }linklist; #define NODESZ sizeof(linklist) linklist *InitLklist(linklist *L); linklist *CreateListF(linklist *L, ElemType a[], int n); linklist *CreateListR(linklist *L, ElemType a[], int n); int ListEmpty(linklist *L); int ListLength(linklist *L); linklist *GetElem(linklist *L, int i); int PrintLklist(linklist *L); int LocateElem(linklist *L, ElemType x); linklist *ListInsert(linklist *L, int i, ElemType e); linklist *ListDelete(linklist *L, int i, ElemType *e); linklist *PriorElem(linklist *L, ElemType e); linklist *NextElem(linklist *L, ElemType e); linklist *ReverseLklist(linklist *L); #endif /* LKLIST_H_ */
lklist.c:
/* * lklist.c */ #include "lklist.h" #include <stdio.h> #include <stdlib.h> linklist *InitLklist(linklist *L) { L = (linklist *) malloc(NODESZ); if (L != NULL) { L->next = NULL; } return L; } linklist *CreateListF(linklist *L, ElemType a[], int n) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); } int i; linklist *s; for (i = 0; i < n; ++i) { s = (linklist *) malloc(NODESZ); s->data = a[i]; s->next = L->next; L->next = s; } return L; } linklist *CreateListR(linklist *L, ElemType a[], int n) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); } int i; linklist *r, *s; r = L; for (i = 0; i < n; ++i) { s = (linklist *) malloc(NODESZ); s->data = a[i]; r->next = s; r = s; } r->next = NULL; return L; } int ListEmpty(linklist *L) { return (NULL == L->next); } int ListLength(linklist *L) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return ERROR; } int i = 0; linklist *p = L; while (p->next != NULL) { i++; p = p->next; } return i; } linklist *GetElem(linklist *L, int i) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return NULL; } linklist *p = L->next; int j = 1; while (p != NULL && j < i) { j++; p = p->next; } if (p != NULL && j == i) { return p; } else { printf("ERROR: Can't find the elem, the position maybe invalid!/n"); return NULL; } } int PrintLklist(linklist *L) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return ERROR; } printf("==============/n"); linklist *p = L->next; while (p != NULL) { printf("%d/n", p->data); p = p->next; } printf("==============/n"); return OK; } int LocateElem(linklist *L, ElemType x) { if (NULL == L) { printf("ERROR: The list is NULL!/n"); return ERROR; } linklist *p = L->next; int i = 1; while (p != NULL && p->data != x) { p = p->next; i++; } if (p != NULL) { return i; } else { return ERROR; } } linklist *ListInsert(linklist *L, int i, ElemType e) { linklist *p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL || j > i - 1) { printf("ERROR: The position is invalid!/n"); return L; } linklist *s = (linklist *) malloc(NODESZ); s->data = e; s->next = p->next; p->next = s; return L; } linklist *ListDelete(linklist *L, int i, ElemType *e) { linklist *p = L; int j = 0; while (p->next != NULL && j < i - 1) { p = p->next; j++; } if (p->next == NULL || j > i - 1) { printf("ERROR: The position is invalid!/n"); return L; } linklist *q = p->next; *e = q->data; p->next = q->next; free(q); return L; } linklist *PriorElem(linklist *L, ElemType e) { linklist *p = L->next; linklist *q = NULL; while (p != NULL && p->data != e) { q = p; p = p->next; } if (p == NULL) { printf("Error: The element can't be found!/n"); return NULL; } else { return q; } } linklist *NextElem(linklist *L, ElemType e) { linklist *p = L; while (p->next != NULL && p->data != e) { p = p->next; } if (p == NULL || p->next == NULL) { printf("Error: The element can't be found!/n"); return NULL; } else { return p->next; } } linklist *ReverseLklist(linklist *L) { linklist *p = L->next; linklist *q = NULL; linklist *h = NULL; while (p != NULL) { q = p->next; p->next = h; h = p; p = q; } L->next = h; return L; }
測試的主程序文件(main函數):
LinkList.c:
/* ============================================================================ Name : LinkList.c Author : Version : Copyright : Description : Hello World in C, Ansi-style ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include "lklist.h" int main(void) { linklist *L; L=InitLklist(L); if(NULL==L->next) { printf("yes!Empty!/n"); } ElemType a[]={1,2,3,4,5,6,7,8,9,10}; L=CreateListR(L,a,10); printf("================/n"); printf("The length is %d/n",ListLength(L)); PrintLklist(L); L=ListInsert(L,1,0); PrintLklist(L); L=ListInsert(L,12,11); PrintLklist(L); L=ListInsert(L,8,66); PrintLklist(L); printf("@@@@@@@@@@@@@@@/n"); ElemType e; L=ListDelete(L,1,&e); PrintLklist(L); printf("%d/n",e); L=ListDelete(L,12,&e); PrintLklist(L); printf("%d/n",e); L=ListDelete(L,7,&e); PrintLklist(L); printf("%d/n",e); L=ReverseLklist(L); PrintLklist(L); return EXIT_SUCCESS; }
這個其實是一個特別高頻的面試題,松哥也一直很想和大家仔細來聊一聊這個話題,網上關於這塊的文章很多,但是我一直覺得要把這個問題講清楚還有點難度,今天我來試一試,看能不能和小夥伴們把這個問題梳理清楚,當然,如果小夥伴們覺得看文章不過癮,松哥也有
分享8個開箱即用的API,方便日常處理集合。 1. 快速過濾空值:Stream.ofNullable 該方法是在 Java 9 中引入的,有助於過濾集合中的所有空值,從而可能使我們避免空指針異常。 在下面的示例中,有一個包含 null 的L
一、背景 在日常部門OpsReview過程中,部門內多次遇到應用容器所在的宿主機磁盤繁忙導致的接口響應緩慢,TP99增高等影響服務性能的問題,其中比較有效的解決方案是開啓日誌的異步打印,可以有效避免同步日誌打印在磁盤IO高起的情況下拖慢業
本文分享自華爲雲社區《【MySQL技術專欄】MySQL8.0直方圖介紹》,作者:GaussDB 數據庫。 背景 數據庫查詢優化器負責將SQL查詢轉換爲儘可能高效的執行計劃,但因爲數據環境不斷變化導致優化器對查詢數據瞭解的不夠充足,可能無法
每篇一句 大魔王張怡寧:女兒,這堆金牌你拿去玩吧,但我的銀牌不能給你玩。你要想玩銀牌就去找你王浩叔叔吧,他那銀牌多 前言 爲了講述好Spring MVC最爲複雜的數據綁定這塊,我前面可謂是做足了功課,對此部分知識此處給小夥伴留一個學
作者:vivo 互聯網數據庫團隊- Qiu Xinbo 本文主要通過圖示介紹了用主鍵進行分片查詢的過程,介紹了主鍵分頁查詢存在SQL性能問題,如何去創建高效的索引去優化主鍵分頁查詢的SQL性能問題 對於數據分佈不均
JSON簡介: JSON(Java Script Object Notation)是一種輕量級的數據交換格式,通常用於在不同系統之間傳輸數據。它基於 JavaScript 對象語法,但已成爲一種獨立於語言的格式。JSON 數據以鍵值對的形式
一、簡單介紹: CaffeineCache和Guava的Cache是應用廣泛的本地緩存。 在開發中,爲了達到降低依賴、提高訪問速度的目的。會使用它存儲一些維表接口的返回值和數據庫查詢結果,在有些場景下也會在分佈式緩存上再加上一層本地緩存,
作者:vivo 互聯網大前端團隊 - Ma Lian 本文主要描述了FileProvider,startAnyWhere實現,Parcel不對稱漏洞以及這三者結合產生的漏洞利用實戰,另外闡述了漏洞利用的影響和修復預防措施,這個漏洞波及了
本文分享自華爲雲社區《GaussDB SQL基本語法示例-CASE表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持SQL標準(默認支持SQL2、SQL3和SQL4的主要
Impala目前支持Hadoop中幾種常見的文件格式 Parquet 、 ORC 、 Text 、 Avro 、 RCFile 和 SequenceFile 。下面簡要說明各種格式的使用、限制和一些注意事項。 不同的文件格式有着不同的適用場
本文分享自華爲雲社區《GaussDB SQL基礎語法示例-BOOLEAN表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持的SQL標準(默認支持SQL2、SQL3和SQL
Map是用於保存具有映射關係的數據集合,它具有雙列存儲的特點,即一次必須添加兩個元素,即一組鍵值對<Key,Value>,其中Key的值不可重複(當Key的值重複的時候,後面插入的對象會將之前插入的具有相同的Key值的對象覆蓋掉),Valu
繼續運行 🥋 回憶上次內容 上上次 真寫了 萬行 代碼 這 萬行 代碼 都是寫在 明面 上的 這次 使用git命令 下載了 github上面的倉庫
Java將List結果分成3份執行 在Java編程中,有時候我們需要將一個List集合中的元素分成幾部分進行處理。這種情況下,我們可以使用Java的相關類庫和API來實現這一需求。在本文中,我們將介紹如何使用Java將List結果分成3份執