使用線性表實現通訊錄管理

目錄

  • 🚀前言
  • 🦜任務目標
  • 🌟順序表實現
  • 🐍鏈表實現

🚀前言

在這里插入圖片描述

大家好!我是 EnigmaCoder
本文介紹線性表的實驗,使用順序表和鏈表實現通訊錄管理,包含初始化、插入、刪除、查詢、輸出。

🦜任務目標

  1. 線性表數據結構應用:利用順序表和鏈表實現動態存儲通訊錄信息,包括初始化、插入、刪除、查詢和遍歷功能。

  2. 核心算法實現:

  • 動態擴容機制( realloc 實現順序表空間擴展);

  • 按學號/姓名的精準查詢(基于自定義比較函數);

  • 元素的插入與刪除(涉及數據移位操作)。

  1. 學生數據樣例:
學號(num)姓名(name)性別(sex)電話號碼(tel)QQ號碼(qq)備注
1001張三138123456781234567890常規數據(男)
1002李四139876543219876543210常規數據(女)
1003王芳15800001111456789123QQ號為9位(合法)
1010劉暢18666668888123456789012QQ號為12位(最大值)

🌟順序表實現

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define LIST_INIT_SIZE  10
#define LISTIHCREAHENT 5typedef struct {int num;char name[20];char sex[3];char tel[14];char qq[12];
}ElemType;typedef struct {ElemType* elem;int length;int listsize;
}SqList;int InitList_Sq(SqList& L) {L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem)exit(-1);L.length = 0;L.listsize = LIST_INIT_SIZE;
}int ListInsert_Sq(SqList& L, int i, ElemType e) {ElemType* newbase;if (i<1 || i>L.length + 1) {return 0;}if (L.length == L.listsize) {newbase = (ElemType*)realloc(L.elem, (LIST_INIT_SIZE + LISTIHCREAHENT) * sizeof(ElemType));if (!L.elem)exit(-1);L.elem = newbase;L.listsize += LISTIHCREAHENT;}for (int j = L.length - 1; j >= i - 1; j--) {L.elem[j + 1] = L.elem[j];}L.elem[i - 1] = e;L.length++;return 1;
}int ListDelete_Sq(SqList& L, int i, ElemType& e) {if (i<0 || i>L.length)return 0;for (int j = i ; j <= L.length-1; j++) {L.elem[j-1] = L.elem[j];}L.length--;return 1;
}int LocateElem_Sq(SqList L, ElemType e, int(*equal)(ElemType, ElemType)) {int i = 1;while (i <= L.length && !equal(e, L.elem[i - 1])) i++;if (i <= L.length) return 1;else return 0;}int comparebynum(ElemType x, ElemType y) {return x.num == y.num ? 1 : 0;
}int comparebyname(ElemType x, ElemType y) {if (strcmp(x.name, y.name) == 0)return 1;else return 0;
}void inputOne(ElemType& x) {scanf("%d%s%s%s%s", &x.num, x.name, x.sex, x.tel, x.qq);
}void outputOne(ElemType x) {printf("%d\t%s\t%s\t%s\t%s\n", x.num, x.name, x.sex, x.tel, x.qq);
}void Output(SqList L) {for (int i = 0; i <= L.length-1; i++) {outputOne(L.elem[i]);}
}int main() {SqList L;int choice,i,y,m;ElemType e,t,x;do{printf("       通訊錄管理系統\n");printf("====================================\n");printf("               0:退出\n");printf("               1:建立通訊錄\n");printf("               2:插入\n");printf("               3:刪除\n");printf("               4:查詢\n");printf("               5:輸出\n");printf("====================================\n");printf("請選擇0-5\n");scanf("%d",&choice);switch(choice){case 0: exit(1);case 1: InitList_Sq(L);break;case 2: printf("input i:");scanf("%d",&i);printf("input one record:");inputOne(e);ListInsert_Sq(L,i,e);break;case 3: printf("input i:");scanf("%d",&i);ListDelete_Sq(L,i,t);break;case 4: printf("41.姓名查詢\n42.學號查詢\n");printf("輸入選項: ");scanf("%d",&y);if(y!=41&&y!=42) {printf("請重新選擇。\n");break; }if(y==41){printf("需查詢的姓名:");scanf("%s",t.name);m=LocateElem_Sq(L,t,comparebyname); }else {printf("需查詢的學號:");scanf("%d",&t.num);m=LocateElem_Sq(L,t,comparebynum);}		        if(m) outputOne(L.elem[m-1]);else  printf("查詢失敗。\n");break;case 5: Output(L);break;		}}while(choice);free(L.elem);return 0;
}

🐍鏈表實現

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct {int num;char name[20];char sex[3];char tel[14];char qq[12];
} ElemType;typedef struct LNode {ElemType data;struct LNode* next;
} LNode, * LinkList;void InitList_L(LinkList& L) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;
}int ListInsert_L(LinkList& L, int i, ElemType e) {LinkList p = L, s;int j = 0;while (p && j < i - 1) {p = p->next;j++;}if (!p || j > i - 1) return -1;s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return 1;
}int ListDelete_L(LinkList& L, int i, ElemType& e) {LinkList p = L, q;int j = 0;while (p->next && j < i - 1) {p = p->next;j++;}if (!(p->next) || j > i - 1) return -1;q = p->next;p->next = q->next;e = q->data;free(q);return 1;
}LinkList LocateElem_L(LinkList L, ElemType e, int(*op)(ElemType a, ElemType b)) {LinkList p = L->next;while (p && !op(p->data, e)) {p = p->next;}return p;
}int comparebynum(ElemType x, ElemType y) {return x.num == y.num ? 1 : 0;
}int comparebyname(ElemType x, ElemType y) {return strcmp(x.name, y.name) == 0 ? 1 : 0;
}void inputOne(ElemType& x) {printf("請輸入學號、姓名、性別、電話、QQ:");scanf("%d%s%s%s%s", &x.num, x.name, x.sex, x.tel, x.qq);
}void outputOne(ElemType x) {printf("%d\t%s\t%s\t%s\t%s\n", x.num, x.name, x.sex, x.tel, x.qq);
}void outputList(LinkList L) {LinkList p = L->next;while (p) {outputOne(p->data);p = p->next;}
}int main() {LinkList L;int choice, i, y;ElemType e, t;do {printf("       通訊錄管理系統\n");printf("====================================\n");printf("               0:退出\n");printf("               1:建立通訊錄\n");printf("               2:插入\n");printf("               3:刪除\n");printf("               4:查詢\n");printf("               5:輸出\n");printf("====================================\n");printf("請選擇0 - 5\n");scanf("%d", &choice);switch (choice) {case 0:exit(1);case 1:InitList_L(L);break;case 2:printf("input i:");scanf("%d", &i);inputOne(e);if (ListInsert_L(L, i, e) == -1) {printf("插入失敗\n");}break;case 3:printf("input i:");scanf("%d", &i);if (ListDelete_L(L, i, e) == -1) {printf("刪除失敗\n");}else {printf("刪除的記錄為:");outputOne(e);}break;case 4:printf("41.姓名查詢\n42.學號查詢\n");printf("輸入選項: ");scanf("%d", &y);if (y != 41 && y != 42) {printf("請重新選擇。\n");break;}if (y == 41) {printf("需查詢的姓名:");scanf("%s", t.name);LinkList result = LocateElem_L(L, t, comparebyname);if (result) {outputOne(result->data);}else {printf("查詢失敗。\n");}}else {printf("需查詢的學號:");scanf("%d", &t.num);LinkList result = LocateElem_L(L, t, comparebynum);if (result) {outputOne(result->data);}else {printf("查詢失敗。\n");}}break;case 5:outputList(L);break;}} while (choice);LinkList p = L;while (p) {LinkList temp = p;p = p->next;free(temp);}return 0;
}    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78337.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

firewall docker 沖突問題解決(親測有效)

# 關閉iptables&#xff0c;使用firewall systemctl disable iptables # 禁用服務 systemctl stop iptables # 關閉服務 systemctl status iptables # 查看服務狀態 systemctl enable firewalld # 設置防火墻開機自啟動 systemctl start firewalld # 開啟服務 systemctl s…

[250428] Nginx 1.28.0 發布:性能優化、安全增強及新特性

目錄 Nginx 1.28.0 穩定版發布主要亮點包括&#xff1a;功能增強&#xff1a;安全性改進&#xff1a;其他&#xff1a; Nginx 1.28.0 穩定版發布 Nginx 官方于 4 月 24 日發布了最新的 1.28.0 穩定版本。此版本基于之前的 1.27.x 主線分支&#xff0c;整合了多項新功能、性能優…

昇騰的CANN是什么?跟英偉達CUDA的有什么聯系和區別?【淺談版】

昇騰的CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是華為專門為AI場景設計的異構計算架構&#xff0c;類似于英偉達的CUDA&#xff0c;但它針對的是華為自家的昇騰AI處理器&#xff08;Ascend系列&#xff09;。簡單來說&#xff0c;CANN的作用是連…

C++ STL vector高級特性與實戰技巧

引言 各位小伙伴們好&#xff01;上一篇博客我們介紹了vector的基礎知識和常見操作&#xff0c;今天我們將更深入地探討vector的高級特性、內存管理細節以及實戰應用技巧。 想象一下vector就像一輛能自動變長的公交車&#xff0c;我們上一篇講了如何上下車&#xff08;添加刪…

使用PageHelper實現分頁查詢(詳細)

一&#xff1a;需求分析與設計 1.1 產品原型 &#xff08;1&#xff09;分頁展示&#xff0c;每頁展示10條數據&#xff0c;根據員工姓名進行搜索 &#xff08;2&#xff09;業務規則 1.2 接口設計 &#xff08;1&#xff09;操作&#xff1a;查詢&#xff0c;請求方式&#xf…

手搓傳染病模型(SEICR)

模型描述 SEICR 模型是一種用于描述具有慢性期的傳染病傳播規律的數學模型。該模型將人群分為五個部分&#xff0c;分別是易感個體&#xff08;Susceptible&#xff0c;S&#xff09;、潛伏期個體&#xff08;Exposed&#xff0c;E&#xff09;、急性期感染個體&#xff08;In…

音視頻開源項目列表

音視頻開源項目列表 一、多媒體處理框架 通用音視頻處理 FFmpeg - https://github.com/FFmpeg/FFmpeg 最強大的音視頻處理工具庫支持幾乎所有格式的編解碼提供命令行工具和開發庫 GStreamer - https://gitlab.freedesktop.org/gstreamer/gstreamer 跨平臺多媒體框架基于管道…

通往“共識空域”的系統倫理演化

隨著低空經濟逐步從分布式運營向跨區域聯動發展&#xff0c;AI無人系統不再只在本地決策&#xff0c;而開始涉及跨城市、跨機構的任務調度與行為協調。這一趨勢帶來了新的倫理挑戰&#xff1a;多系統之間如何達成行動共識&#xff1f;算法背后的價值判斷標準能否統一&#xff1…

Elasticsearch 常用的 API 接口

文檔類 API Index API &#xff1a;創建并建立索引&#xff0c;向指定索引添加文檔。例如&#xff1a;PUT /twitter/tweet/1 &#xff0c;添加一個文檔。 Get API &#xff1a;獲取文檔&#xff0c;通過索引、類型和 ID 獲取文檔。如GET /twitter/tweet/1。 DELETE API &…

【Vue】性能優化與調試技巧

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. Vue 性能優化與調試技巧1.1 使用 v-if 替代 v-show 控制條件渲染示例代碼&#xff1a; 1.2 組件懶加載&#xff08;異步組件&#xff09;示例代碼&#xff1a;效果分析圖&#xff08;Mermaid 圖表示&#xff09…

廣義線性模型三劍客:線性回歸、邏輯回歸與Softmax分類的統一視角

文章目錄 廣義線性模型三劍客&#xff1a;線性回歸、邏輯回歸與Softmax分類的統一視角引言&#xff1a;機器學習中的"家族相似性"廣義線性模型(GLMs)基礎三位家族成員的統一視角1. 線性回歸(Linear Regression)2. 邏輯回歸(Logistic Regression)3. Softmax分類(Softm…

【Linux系統篇】:Linux線程控制基礎---線程的創建,等待與終止

?感謝您閱讀本篇文章&#xff0c;文章內容是個人學習筆記的整理&#xff0c;如果哪里有誤的話還請您指正噢? ? 個人主頁&#xff1a;余輝zmh–CSDN博客 ? 文章所屬專欄&#xff1a;Linux篇–CSDN博客 文章目錄 一.線程創建二.線程等待三.線程終止四.擴展內容1.重談pthread_…

More Effective C++學習筆記

條款1 指針與引用的區別 條款2 盡量使用C風格的類型轉換 條款3 不要對數組使用多態 條款4 避免無用的缺省構造函數 條款5 謹慎定義類型轉換函數 條款6 自增(increment)、自減(decrement)操作符前綴形式與后綴形式的區別 條款7 不要重載“&&”,“||”, 或“,” 條款8 理…

先知AIGC超級工場,撬動運營效率新杠桿

北京先智先行科技有限公司&#xff0c;作為行業內的重要參與者&#xff0c;擁有“先知大模型”、“先行AI商學院”以及“先知AIGC超級工場”這三款旗艦產品。這些產品在不同領域發揮著關鍵作用&#xff0c;尤其是先知AIGC超級工場&#xff0c;正悄然改變著內容創作與產品推廣的…

十一歲少年葉珉雪用藝術點亮公益之路 個人原創公益演唱會傳遞大愛與擔當

4月29日晚&#xff0c;"韶華映雪益路同行"葉珉雪個人原創公益演唱會在廣東碧桂園學校歌劇院圓滿落幕。 這場由該校美育成果澆灌出的藝術盛宴&#xff0c;生動詮釋了廣東碧桂園學校育人理念。11歲的葉珉雪以超越年齡的藝術掌控力&#xff0c;呈現了一場融合歌唱、舞蹈…

【深度學習基礎】:VGG實戰篇(圖像風格遷移)

文章目錄 前言style transfer原理原理解析損失函數 style transfer代碼效果圖 fast style transfer 代碼效果圖 前言 本篇來帶大家看看VGG的實戰篇&#xff0c;這次來帶大家看看計算機視覺中一個有趣的小任務&#xff0c;圖像風格遷移。 可運行代碼位于&#xff1a; Style_tr…

python爬蟲基礎:requests庫詳解與案例

1.Requests模塊的使用 requests模塊的介紹與安裝 作用&#xff1a;發送網絡請求&#xff0c;返回響應數據。 中文文檔&#xff1a;https://requests.readthedocs.io/projects/cn/zh_CN/latest/ 對于爬蟲任務&#xff0c;使用 requests模塊基本能夠解決絕大部分的數據抓取的…

Spring 容器相關的核心注解?

以下是 Spring 容器中用于 ??Bean 管理、依賴注入、配置控制?? 的關鍵注解&#xff0c;按功能分類說明&#xff1a; ??1. Bean 聲明與注冊?? 注解作用示例??Component??通用注解&#xff0c;標記一個類為 Spring Bean&#xff08;自動掃描注冊&#xff09; Compo…

C與指針5——字符串合集

常用函數 1、拷貝、長度、比較 size_t strlen();\\返回無符號整形 char* strcpy();char* strncpy();\\拷貝 int strcmp();int strncmp();\\比較 char* strcat();char* strncat();\\連接2、查找 char* strchr(const char * st,int ch);\\找字符第一次出現的位置 char* strrch…

論軟件需求管理

目錄 摘要&#xff08;300~330字&#xff09; 正文&#xff08;2000~2500字&#xff0c;2200字為宜&#xff09; 背景介紹&#xff08;500字做左右&#xff09; 論點論據&#xff08;1500字做左右&#xff09; 收尾&#xff08;200字左右&#xff09; 注&#xff1a;本篇論…