基于順序表的通訊錄實現

一、前言

基于已經學過的順序表,可以實現一個簡單的通訊錄。

二、通訊錄相關頭文件

//Contact.h
#pragma once#define NAME_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 20
#define GENDER_MAX 20typedef struct PersonInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}PsInFo;//struct SeqList;//前置聲明typedef struct SeqList Contact;//對順序表重命名為通訊錄//通訊錄的初始化
void ContactInit(Contact* pcon);//通訊錄的銷毀
void ContactDestroy(Contact* pcon);//添加聯系人
void ContactAdd(Contact* pcon);//刪除聯系人
void ContactDel(Contact* pcon);//查找聯系人
void ContactFind(Contact* pcon);//修改聯系人
void ContactModify(Contact* pcon);//展示聯系人
void ContactShow(Contact* pcon);

上述代碼中結構體是我們自己定義的通訊錄中聯系人的基本信息,通訊錄中的聯系人就相當于是順序表中的一個個數據,而通訊錄就相當于是順序表;

至于后面兩行代碼(前置聲明和重命名)需要結合以下代碼來理解

//SeqList.h
#pragma once
//順序表
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//引用通訊錄的頭文件來對數據類型進行重命名
#include"Contact.h"typedef PsInFo SeqDatatype;typedef struct SeqList
{SeqDatatype* arr;int size;int capacity;
}SL;//初始化順序表
void SeqInit(SL* ps);
//銷毀順序表
void SeqDestroy(SL* ps);
//順序表尾插
void SeqPushBack(SL* ps, SeqDatatype x);
//申請空間
void SeqCheckSpace(SL* ps);
//打印順序表的元素
void SeqPrint(SL* ps);
//順序表頭插
void SeqPushFront(SL* ps, SeqDatatype x);
//順序表尾刪
void SeqPopBack(SL* ps);
//順序表頭刪
void SeqPopFront(SL* ps);
//指定位置前插入數據
void SeqInsert(SL* ps, int pos, SeqDatatype x);
//刪除指定位置的數據
void SeqErase(SL* ps, int pos);
//尋找數據(以下標的形式返回)
//int SeqFind(SL s, SeqDatatype x);

這是順序表的頭文件,我們為了將聯系人PsInFo定義為新的數據類型需要引用Contact.h的頭文件,這是因為聯系人是在Contact.h中定義的;所以現在回到第一段本文展示的代碼中的那兩行代碼(前置聲明和重命名),我們為了讓SeqList等同于Contact,需要重命名,但是此時要使用SeqList不能直接包含SeqList.h這個頭文件,這時因為頭文件不能互相包含,此時我們需要進行前置聲明,也就是struct SeqList; 可以直接結合起來寫成typedef struct SeqList Contact;

值得注意的是,這里不能寫成typedef SL Contact;因為這相當于沒有進行前置聲明。解釋:雖然在順序表頭文件中,typedef strcut SeqList{·······}SL 看似是結構體和SL一起定義的,但實際上是結構體先定義的,也就是說,在這個結構體未定義的時候就使用SL是非法的,在Contact.h中寫成typedef SL Contact; 就是遇到了這種錯誤,所以要進行前置聲明,這樣就能規避這種問題。

三、通訊錄的具體實現

1、初始化

//初始化通訊錄
void ContactInit(Contact* pcon)
{assert(pcon);SeqInit(pcon);
}

2、銷毀

//通訊錄銷毀
void ContactDestroy(Contact* pcon)
{assert(pcon);SeqDestroy(pcon);
}

3、添加聯系人

//添加聯系人
void ContactAdd(Contact* pcon)
{assert(pcon);SeqCheckSpace(pcon);PsInFo info;//定義一個聯系人printf("輸入聯系人姓名:\n");scanf("%s", info.name);printf("輸入聯系人性別:\n");scanf("%s", info.gender);printf("輸入聯系人年齡:\n");scanf("%d", &info.age);printf("輸入聯系人電話:\n");scanf("%s", info.tel);printf("輸入聯系人地址:\n");scanf("%s", info.addr);SeqPushBack(pcon,info);
}

?把聯系人當成順序表中的數據,先把這個數據賦予確定的數值,在這里相當于是給聯系人輸入一個個屬性(姓名、性別、年齡······),最后進行順序表尾插的操作;

4、返回聯系人下標

int FindByName(Contact* pcon,char name[])
{for (int i = 0; i < pcon->size; i++){if (strcmp(name, pcon->arr[i].name)==0){return i;}}return -1;
}

這個函數是通過姓名比較的方式來返回即將進行一系列操作的聯系人的下標?

5、刪除聯系人

//刪除聯系人
void ContactDel(Contact* pcon)
{assert(pcon);assert(pcon->size);char name[NAME_MAX];printf("輸入要刪除的聯系人姓名:\n");scanf("%s", name);int rsl=FindByName(pcon,name);if (rsl == -1){printf("你要刪除的聯系人不存在\n");}else{SeqErase(pcon, rsl);}
}

首先判斷這個通訊錄里面有沒有聯系人,沒有聯系人則斷言錯誤,無法刪除。接著要輸入一個聯系人姓名,再在通過FindByName這個通訊錄里面進行遍歷看是否有沒有這個聯系人,如果沒有接收到錯誤的下標,進行不了后續操作;找到了返回這個姓名的聯系人的下標,然后使用SeqErase刪除這個下標處的聯系人;

6、查找聯系人

//查找聯系人
void ContactFind(Contact* pcon)
{assert(pcon);char name[NAME_MAX];printf("輸入要查找的聯系人姓名:\n");scanf("%s", name);int rsl = FindByName(pcon, name);if (rsl == -1){printf("你要查找的聯系人不存在\n");}else{printf("%s""%s""%s""%s""%s", "姓名 ", "性別 ", "年齡 ", "電話 ", "地址 ");printf("\n");printf("%s ""%s ""%d ""%s ""%s ", pcon->arr[rsl].name, pcon->arr[rsl].gender, pcon->arr[rsl].age, pcon->arr[rsl].tel, pcon->arr[rsl].addr);printf("\n");}
}

查找聯系人不同于返回聯系人下標,它要展示出所查找的這個聯系人的相關信息;

7、修改聯系人信息

//修改聯系人
void ContactModify(Contact* pcon)
{assert(pcon);char name[NAME_MAX];printf("輸入要修改信息的聯系人姓名:\n");scanf("%s", name);int rsl = FindByName(pcon, name);if (rsl == -1){printf("你要修改信息的聯系人不存在\n");}else{printf("開始輸入新的聯系人信息\n");printf("輸入聯系人姓名:\n");scanf("%s", pcon->arr[rsl].name);printf("輸入聯系人性別:\n");scanf("%s", pcon->arr[rsl].gender);printf("輸入聯系人年齡:\n");scanf("%d", &pcon->arr[rsl].age);printf("輸入聯系人電話:\n");scanf("%s", pcon->arr[rsl].tel);printf("輸入聯系人地址:\n");scanf("%s", pcon->arr[rsl].addr);}
}

同樣的,先通過姓名的比較來判斷該聯系人存不存在,若是有則重新在此聯系人下標處出入相關信息;

8、展示聯系人

//展示聯系人
void ContactShow(Contact* pcon)
{assert(pcon);printf("%s""%s""%s""%s""%s", "姓名 ", "性別 ", "年齡 ", "電話 ", "地址 ");printf("\n");for (int i = 0; i < pcon->size; i++){printf("%s ", pcon->arr[i].name);printf("%s ", pcon->arr[i].gender);printf("%d ", pcon->arr[i].age);printf("%s ", pcon->arr[i].tel);printf("%s ", pcon->arr[i].addr);printf("\n");}
}

通過遍歷通訊錄來展翅一個一個聯系人的相關信息。

四、設置操作面板

#include"Contact.h"
#include"SeqList.h"void menu()
{printf("********** 1.增加聯系人**********\n");printf("********** 2.刪除聯系人**********\n");printf("********** 3.查找聯系人**********\n");printf("********** 4.修改聯系人**********\n");printf("********** 5.展示聯系人**********\n");printf("********** 6.銷毀通訊錄**********\n");printf("********** 0.退出      **********\n");}
int main()
{menu();Contact con;ContactInit(&con);int option = -1;do{printf("輸入操作數:\n");scanf_s("%d", &option);switch (option){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactFind(&con);break;case 4:ContactModify(&con);break;case 5:ContactShow(&con);break;case 6:ContactDestroy(&con);break;case 0:printf("退出\n");return;default:printf("輸入錯誤,重新選擇\n");}} while (option);return 0;
}

??


完。

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

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

相關文章

Python的招聘數據分析與可視化管理系統-計算機畢業設計源碼55218

摘要 隨著互聯網的迅速發展&#xff0c;招聘數據在規模和復雜性上呈現爆炸式增長&#xff0c;對數據的深入分析和有效可視化成為招聘決策和招聘管理的重要手段。本論文旨在構建一個基于Python的招聘數據分析與可視化管理系統。 該平臺以主流招聘平臺為數據源&#xff0c;利用Py…

MSPM0G3507——解決printf重定向在其他位置不能用的問題(printf重定向的補充)

除了之前發的文章的printf重定向的代碼之外&#xff0c;還要加上這樣一段代碼即可 int puts(const char *_ptr) {int count fputs(_ptr,stdout);count fputs("\n",stdout);return count;} 完整的重定向&#xff1a; int fputc(int c, FILE* stream) {DL_UART_Main_…

昇思25天學習打卡營第2天|MindSpore快速入門

打卡 目錄 打卡 快速入門案例&#xff1a;minist圖像數據識別任務 案例任務說明 流程 1 加載并處理數據集 2 模型網絡構建與定義 3 模型約束定義 4 模型訓練 5 模型保存 6 模型推理 相關參考文檔入門理解 MindSpore數據處理引擎 模型網絡參數初始化 模型優化器 …

一個字符串的全部子序列和全排列

在計算機科學中&#xff0c;字符串的子序列和全排列是兩個重要的概念。 1. 子序列 子序列是從一個序列中刪除一些&#xff08;或不刪除&#xff09;元素而不改變剩余元素的順序形成的新序列。 例如&#xff0c;字符串 “abc” 的子序列包括&#xff1a; “”&#xff08;空…

如何選擇TikTok菲律賓直播網絡?

為了滿足用戶對于實時互動的需求&#xff0c;TikTok推出了直播功能&#xff0c;讓用戶能夠與粉絲即時交流。本文將探討如何選擇適合的TikTok菲律賓直播網絡&#xff0c;并分析OgLive是否是值得信賴的選擇。 TikTok菲律賓直播網絡面臨的挑戰 作為全球領先的短視頻平臺&#xff…

Python + OpenCV 開啟圖片、寫入儲存圖片

這篇教學會介紹OpenCV 里imread()、imshow()、waitKey() 方法&#xff0c;透過這些方法&#xff0c;在電腦中使用不同的色彩模式開啟圖片并顯示圖片。 imread() 開啟圖片 使用imread() 方法&#xff0c;可以開啟圖片&#xff0c;imread() 有兩個參數&#xff0c;第一個參數為檔…

Google Play上架:惡意軟件、移動垃圾軟件和行為透明度詳細解析和解決辦法 (一)

近期整理了許多開發者的拒審郵件和內容,也發現了許多問題,今天來說一下關于惡意軟件這類拒審的問題。 目標郵件如下: 首先說一下各位小伙伴留言私信的一個方法,提供你的拒審郵件和時間,盡可能的詳細,這樣會幫助我們的團隊了解你們的問題,去幫助小伙伴么解決問題。由于前…

在 .NET 8 Web API 中實現彈性

在現代 Web 開發中&#xff0c;構建彈性 API 對于確保可靠性和性能至關重要。本文將指導您使用 Microsoft.Extensions.Http.Resilience 庫在 .NET 8 Web API 中實現彈性。我們將介紹如何設置重試策略和超時&#xff0c;以使您的 API 更能抵御瞬時故障。 步驟 1.創建一個新的 .…

集成學習(一)Bagging

前邊學習了&#xff1a;十大集成學習模型&#xff08;簡單版&#xff09;-CSDN博客 Bagging又稱為“裝袋法”&#xff0c;它是所有集成學習方法當中最為著名、最為簡單、也最為有效的操作之一。 在Bagging集成當中&#xff0c;我們并行建立多個弱評估器&#xff08;通常是決策…

排序——數據結構與算法 總結8

目錄 8.1 排序相關概念 8.2 插入排序 8.2.1 直接插入排序&#xff1a; 8.2.2 折半插入排序&#xff1a; 8.2.3 希爾排序&#xff1a; 8.3 交換排序 8.3.1 冒泡排序&#xff1a; 8.3.2 快速排序&#xff1a; 8.4 選擇排序 8.4.1 簡單選擇排序 8.4.2 堆排序 8.5 歸并…

磁盤就是一個超大的Byte數組,操作系統是如何管理的?

磁盤在操作系統的維度看&#xff0c;就是一個“超大的Byte數組”。 那么操作系統是如何對這塊“超大的Byte數組”做管理的呢&#xff1f; 我們知道在邏輯上&#xff0c;上帝說是用“文件”的概念來進行管理的。于是&#xff0c;便有了“文件系統”。那么&#xff0c;文件系統…

當前國內可用的docker加速器搜集 —— 筑夢之路

可用鏡像加速器 以下地址搜集自網絡&#xff0c;僅供參考&#xff0c;請自行驗證。 1、https://docker.m.daocloud.io2、https://dockerpull.com3、https://atomhub.openatom.cn4、https://docker.1panel.live5、https://dockerhub.jobcher.com6、https://hub.rat.dev7、http…

最新版情侶飛行棋dofm,已解鎖高階私密模式,單身狗務必繞道!(附深夜學習資源)

今天阿星要跟大家聊一款讓阿星這個大老爺們兒面紅耳赤的神奇游戲——情侶飛行棋。它的神奇之處就在于專為情侶設計&#xff0c;能讓情侶之間感情迅速升溫&#xff0c;但單身狗們請自覺繞道&#xff0c;不然后果自負哦&#xff01; 打開游戲&#xff0c;界面清新&#xff0c;操…

HTML5使用<progress>進度條、<meter>刻度條

1、<progress>進度條 定義進度信息使用的是 progress 標簽。它表示一個任務的完成進度&#xff0c;這個進度可以是不確定的&#xff0c;只是表示進度正在進行&#xff0c;但是不清楚還有多少工作量沒有完成&#xff0c;也可以用0到某個最大數字&#xff08;如&#xff1…

vs2022安裝qt vs tool

1 緣由 由于工作的需要&#xff0c;要在vs2022上安裝qt插件進行開發。依次安裝qt&#xff0c;vs2022&#xff0c;在vs2022的擴展管理中安裝qt vs tool。 2 遇到困難 問題來了&#xff0c;在qt vs tool的設置qt version中出現問題&#xff0c;設置msvc_64-bit時出現提示“invali…

西安石油大學 課程習題信息管理系統(數據庫課設)

主要技術棧 Java Mysql SpringBoot Tomcat HTML CSS JavaScript 該課設必備環境配置教程&#xff1a;&#xff08;參考給出的鏈接和給出的關鍵鏈接&#xff09; JAVA課設必備環境配置 教程 JDK Tomcat配置 IDEA開發環境配置 項目部署參考視頻 若依框架 鏈接數據庫格式注…

【中項第三版】系統集成項目管理工程師 | 第 4 章 信息系統架構① | 4.1-4.2

前言 第4章對應的內容選擇題和案例分析都會進行考查&#xff0c;這一章節屬于技術相關的內容&#xff0c;學習要以教材為準。本章分值預計在4-5分。 目錄 4.1 架構基礎 4.1.1 指導思想 4.1.2 設計原則 4.1.3 建設目標 4.1.4 總體框架 4.2 系統架構 4.2.1 架構定義 4.…

Invoice OCR

Invoice OCR 發票識別 其他類型ORC&#xff1a; DIPS_YTPC OCR-CSDN博客

25款404網頁源碼(上)

25款404網頁源碼&#xff08;上&#xff09; 1部分源碼 2部分源碼 3部分源碼 4部分源碼 5部分源碼 6部分源碼 7部分源碼 8部分源碼 9部分源碼 10部分源碼 11部分源碼 12部分源碼 領取完整源碼下期更新 1 部分源碼 <!DOCTYPE html> <html><!-- 優選源碼 gulang.…

數據結構基礎--------【二叉樹基礎】

二叉樹基礎 二叉樹是一種常見的數據結構&#xff0c;由節點組成&#xff0c;每個節點最多有兩個子節點&#xff0c;左子節點和右子節點。二叉樹可以用來表示許多實際問題&#xff0c;如計算機程序中的表達式、組織結構等。以下是一些二叉樹的概念&#xff1a; 二叉樹的深度&a…