基于順序表實現通訊錄

1.功能實現

功能要求
1)至少能夠存儲100個人的通訊信息
2)能夠保存用戶信息:名字、性別、年齡、電話、地址等
3)增加聯系人信息
4)刪除指定聯系人
5)查找制定聯系人
6)修改指定聯系人
7)顯聯系人信息

2.與順序表的關系

在這里插入圖片描述

3.代碼實現

1.通訊錄基本結構Contact.h

在這里插入圖片描述
Contact.h文件代碼如下

#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 15
#define ADDR_MAX 100//創建通訊錄的結構
typedef struct ContactInfo
{char name[NAME_MAX];char sex[SEX_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}CInfo;typedef struct SeqList contact;//此處相當于把順序表的名字改為通訊錄,也可以理解為我把順序表的SL改為了contact,不容易搞混
//因為并沒有調用"SeqList.h"里面的數據或者函數,所以這里不需要調用void ContactInit(contact* pcon);    //通訊錄的創建
void ContactDestroy(contact* pcon); //通訊錄的銷毀void ContactAdd(contact* *pcon);    //添加聯系人
void ContactDel(contact* pcon);     //刪除聯系人void ContactModify(contact* pcon);  //修改聯系人
void Contactshow(contact* pcon);    //打印聯系人void ContactFind(contact* pcon);    //查找聯系人

2.基于通訊錄SqList.h文件的改進

需要把順序表的數據類型改為通訊錄的結構體,這里就體現了之前在順序表把int類型通過typedef聲明為SLDataType的好處,可以很方便的更換順序表的類型,不用一個個改。

在這里插入圖片描述

SqList.h文件代碼如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Contact.h"typedef CInfo SLDataType;
//typedef int SLDataType;
//把順序表的數據結構改為通訊錄的結構體類型typedef struct SeqList
{SLDataType* a;int size;       // 有效數據int capacity;   // 空間容量
}SL;void SLInit(SL* ps);    // 數據表初始化
void SLDestroy(SL* ps); // 數據表銷毀void SLPushFront(SL* ps, SLDataType x); // 頭插
void SLPushBack(SL* ps, SLDataType x);  // 尾插void SLPopFront(SL* ps);  // 頭刪
void SLPopBack(SL* ps);   // 尾刪void SLCheckCapacity(SL* ps); // 檢查內存是否足夠,不夠就擴容。
void SLprintf(SL* ps);  // 數據表打印void SLInsert(SL* ps, int pos, SLDataType x);  //任意下標位置的插入
void SLErase(SL* ps, int pos);  //任意下標位置的刪除

3通訊錄運行文件Contact.c

1. 通訊錄的創建ContactInit

只需要調用順序表的初始化就可以啦

void ContactInit(contact* pcon)
{SLInit(pcon);
}

2.通訊錄的銷毀ContactDestroy

一樣的道理,順序表都銷毀了,基于它的通訊錄還好存在嗎?所以自己調用順序表的銷毀就OK啦

void ContactDestroy(contact* pcon)
{SLDestroy(pcon);
}

3.添加聯系人

到這里就需要創建個通訊錄結構體(info),然后輸入值到通訊錄的結構體中,隨便打印個提示界面,然后記得調用順序表的尾插操作,通過info把數據插入到順序表中,因為順序表的數據類型是CInfo也就是struct ContactInfo,所以并不沖突。
在這里插入圖片描述

void ContactAdd(contact** pcon)
{CInfo info;printf("請輸入聯系人的姓名:\n");scanf("%s", info.name);printf("請輸入聯系人的性別:\n");scanf("%s", info.sex);printf("請輸入聯系人的年齡:\n");scanf("%d", &info.age);printf("請輸入聯系人的電話:\n");scanf("%s", info.tel);printf("請輸入聯系人的住址:\n");scanf("%s", info.addr);SLPushBack(pcon, info);
}

4.刪除聯系人

有了創建自然就有刪除,但是刪除刪除哪里了,所以還要個查找操作

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

先輸入用戶名,然后通過用戶名進行查找操作,找到了就調用順序表的刪除操作

void ContactDel(contact* pcon)
{printf("請輸入要刪除的用戶的名稱:\n");char name[NAME_MAX];scanf("%s", &name);int findidex = FindByName(pcon,name);SLPopBack(pcon);if (findidex < 0){printf("要刪除的聯系人不存在");return;}SLErase(pcon, findidex);
}

5.修改聯系人

通過查找,

void ContactModify(contact* pcon)
{printf("請輸入要修改的用戶名稱:\n");char name[NAME_MAX];scanf("%s", name);int find = FindByName(pcon, name);if (find < 0){printf("要修改的用戶不存在!\n");return;}printf("請輸入新的用戶名稱:\n");scanf("%s", pcon->a[find].name);printf("請輸入新的用戶性別:\n");scanf("%s", pcon->a[find].sex);printf("請輸入新的用戶年齡:\n");scanf("%s", pcon->a[find].age);printf("請輸入新的用戶電話:\n");scanf("%s", pcon->a[find].tel);printf("請輸入新的用戶地址:\n");scanf("%s", pcon->a[find].addr);printf("修改成功\n");
}

6.打印聯系人

void Contactshow(contact* pcon)
{printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "住址");for(int i = 0; i < pcon->size; i++){printf("%-4s %-4s %-4d %-4s %-4s\n",pcon->a[i].name,pcon->a[i].sex,pcon->a[i].age,pcon->a[i].tel,pcon->a[i].addr);}
}

7.查找聯系人

void ContactFind(contact* pcon)
{char name[NAME_MAX];printf("請輸入要查找的用戶名稱:\n");scanf("%s", name);int find = FindByName(pcon, name);if (find < 0){printf("該聯系人不存在\n");return;}printf("%s %s %d %s %s\n",pcon->a[find].name,pcon->a[find].sex,pcon->a[find].age,pcon->a[find].tel,pcon->a[find].addr);
}

完整代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void ContactInit(contact* pcon)
{SLInit(pcon);
}
void ContactDestroy(contact* pcon)
{SLDestroy(pcon);
}void ContactAdd(contact** pcon)
{CInfo info;printf("請輸入聯系人的姓名:\n");scanf("%s", info.name);printf("請輸入聯系人的性別:\n");scanf("%s", info.sex);printf("請輸入聯系人的年齡:\n");scanf("%d", &info.age);printf("請輸入聯系人的電話:\n");scanf("%s", info.tel);printf("請輸入聯系人的住址:\n");scanf("%s", info.addr);SLPushBack(pcon, info);
}int FindByName(contact* pcon,char name)
{for (int i = 0; i < pcon->size; pcon->size++){if (strcmp(pcon->size,name)==0){return i;}}return -1;
}void ContactDel(contact* pcon)
{printf("請輸入要刪除的用戶的名稱:\n");char name[NAME_MAX];scanf("%s", &name);int findidex = FindByName(pcon,name);SLPopBack(pcon);if (findidex < 0){printf("要刪除的聯系人不存在");return;}SLErase(pcon, findidex);
}void ContactModify(contact* pcon)
{printf("請輸入要修改的用戶名稱:\n");char name[NAME_MAX];scanf("%s", name);int find = FindByName(pcon, name);if (find < 0){printf("要修改的用戶不存在!\n");return;}printf("請輸入新的用戶名稱:\n");scanf("%s", pcon->a[find].name);printf("請輸入新的用戶性別:\n");scanf("%s", pcon->a[find].sex);printf("請輸入新的用戶年齡:\n");scanf("%s", pcon->a[find].age);printf("請輸入新的用戶電話:\n");scanf("%s", pcon->a[find].tel);printf("請輸入新的用戶地址:\n");scanf("%s", pcon->a[find].addr);printf("修改成功\n");
}void Contactshow(contact* pcon)
{printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "住址");for(int i = 0; i < pcon->size; i++){printf("%-4s %-4s %-4d %-4s %-4s\n",pcon->a[i].name,pcon->a[i].sex,pcon->a[i].age,pcon->a[i].tel,pcon->a[i].addr);}
}void ContactFind(contact* pcon)
{char name[NAME_MAX];printf("請輸入要查找的用戶名稱:\n");scanf("%s", name);int find = FindByName(pcon, name);if (find < 0){printf("該聯系人不存在\n");return;}printf("%s %s %d %s %s\n",pcon->a[find].name,pcon->a[find].sex,pcon->a[find].age,pcon->a[find].tel,pcon->a[find].addr);
}

4SeqList.c順序表的基本函數

此處存放順序表的基本操作函數,所以無需修改,與通訊錄有關的操作存放在Contact.c文件中

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void SLCheckCapacity(SL* ps)  // 檢查內存是否足夠,不夠就擴容。
{if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity = newCapacity;}
}void SLprintf(SL* ps)   // 數據表打印
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}void SLInit(SL* ps)     // 數據表初始化
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}void SLDestroy(SL* ps)  // 數據表銷毀
{assert(ps);if (ps->a != NULL){free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;}
}void SLPushFront(SL* ps, SLDataType x)  // 頭插
{assert(ps);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}void SLPushBack(SL* ps, SLDataType x)   // 尾插
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size++] = x;
}void SLPopFront(SL* ps) // 頭刪
{assert(ps);assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}void SLPopBack(SL* ps)  // 尾刪
{assert(ps);assert(ps->size > 0);ps->size--;
}// pos是下標
void SLInsert(SL* ps, int pos, SLDataType x)  // 任意下標位置的插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}
void SLErase(SL* ps, int pos)    // 任意下標位置的刪除
{assert(ps);assert(pos >= 0 && pos < ps->size);   // 這里刪除不能用等于ps->size,ps->size看作下標的話相當于下標的最后一個位置+1int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

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

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

相關文章

Hutool HttpRequest 首次請求正常 第二次被系統攔截

Hutool HttpRequest 首次請求正常 第二次被系統攔截 功能描述異常現象錯誤代碼 異常排查問題跟蹤問題總結處理方案最終修改后的代碼 功能描述 需要請求第三方某個接口&#xff0c;獲取接口中的數據。 異常現象 使用main 方法 通過Hutool 工具類發出請求&#xff0c;獲取數據…

網絡運維與網絡安全 學習筆記2023.11.22

網絡運維與網絡安全 學習筆記 第二十三天 今日目標 VLAN間通信之交換機、VLAN間通信綜合案例、浮動路由 VRRP原理與配置、VRRP鏈路跟蹤、VRRP安全認證 VLAN間通信之交換機 單臂路由的缺陷 在內網的VLAN數量增多時&#xff0c;單臂鏈路容易成為網絡瓶頸 三層交換機 具備…

react中模塊化樣式中:global的作用

在react中如果是通過import styles from ./index.less這種方式模塊化引入樣式的話&#xff0c;那么編譯后的less文件里的樣式名都會自動添加后綴。而:global的作用就是不讓類名添加后綴

利用 Apache Ranger 管理 Amazon EMR 中的數據權限

需求背景簡介 系統安全通常包括兩個核心主題&#xff1a;身份驗證和授權。一個解決“用戶是誰”的問題&#xff0c;另一個解決“用戶允許執行什么操作”的問題。在大數據領域&#xff0c;Apache Ranger 是最受歡迎的授權選擇之一&#xff0c;它支持所有主流大數據組件&#xff…

微機原理_1

一、單項選擇題(本大題共15小題,每小題3分,共45分。在每小題給出的四個備選項中,選出一個正確的答案,請將選定的答案填涂在答題紙的相應位置上。) 1,下列8086CPU標志寄存器的標志位中,不屬于狀態標志位的是(&#xff09; A. OF B. IF C. AF D. PF 8086微處理器可尋址訪問的最大…

面試中vue-router的一些知識點

Vue Router Vue Router使用舉例說明 vue-router 中 route和router的區別與聯系 route和router的區別與聯系 vue3 路由使用vue2 路由與vue3 路由的區別與聯系 Vue Router Vue Router是Vue.js官方的路由管理器&#xff0c;用于實現單頁面應用中的路由功能。它允許我們在Vue應用程…

萬界星空科技SMT行業生產管理MES系統解決方案

一、SMT行業特點&#xff1a; SMT&#xff08;Surface Mounted Technology&#xff09;作為電子組裝行業里首先的技術和工藝&#xff0c;選擇合適的MES解決方案來保障SMT生產的成功至關重要。 電子行業涉及的范圍非常廣&#xff0c;包含了汽車、電腦、電視、手機等產品上&…

HCIA-Datacom跟官方路線學習

通過兩次更換策略。最后找到最終的學習方案&#xff0c;華為ICT官網有對這個路線的學習&#xff0c;hcia基礎有這個學習路線&#xff0c;hcip也有目錄路線。所以&#xff0c;最后制定學習路線&#xff0c;是根據這個認證的路線進行學習了&#xff1a; 官網課程&#xff1a;課程…

scala 實現表達式解析

表達式解析 import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource "source_1"private val saleChannel "saleChannel"val datas new mutable.HashMap[String, String]();// p1, source1, sale1, source…

everything的高效使用方法

目錄 前言1 everything的簡單介紹2 常用搜索3 語法搜索4 正則表達式搜索5 服務器功能 前言 本文介紹everything軟件的高效使用方法&#xff0c;everything是一款在系統中快速搜索文件的軟件&#xff0c;能夠幫助人們快速定位需要查找的文件。首先介紹everything軟件的作用和使…

掌握 AI 和 NLP:深入研究 Python — 情感分析、NER 等

一、說明 我們見證了 BERT 等預訓練模型在情感分析方面的強大功能,使我們能夠破譯隱藏在文本數據中的情感。通過 SpaCy,我們探索了命名實體識別的迷人世界,揭開了隱藏在非結構化文本中的秘密。 二、問題陳述 命名實體識別(NER)是自然語言處理中的一項關鍵…

數字化時代的政務服務:構建便捷高效的線上政務大廳

引言&#xff1a; 隨著數字化時代的來臨&#xff0c;如何通過線上政務大廳搭建一個便捷高效的服務平臺&#xff0c;以更好地滿足公眾需求值得探究。線上政務大廳是政務服務的新方式&#xff0c;但搭建線上政務大廳并不是一件容易的事情&#xff0c;需要精心的規劃和設計。 一…

【藍橋杯選拔賽真題25】C++兩個數比大小 第十三屆藍橋杯青少年創意編程大賽C++編程選拔賽真題解析

目錄 C/C++兩個數比大小 一、題目要求 1、編程實現 2、輸入輸出 二、算法分析

Linux文件I/O:基本概念

Linux是一個開源的操作系統&#xff0c;它提供了一套豐富的文件I/O&#xff08;輸入/輸出&#xff09;接口&#xff0c;讓用戶和程序可以方便地對文件進行讀寫操作。文件I/O是操作系統中最基本也最重要的功能之一&#xff0c;它涉及到文件的打開、關閉、讀取、寫入、定位、鎖定…

centos無法進入系統之原因解決辦法集合

前言 可愛的小伙伴們&#xff0c;由于精力有限&#xff0c;暫時整理了兩類。如果沒有你遇到的問題也沒有關系&#xff0c;歡迎底下留言評論或私信&#xff0c;小編看到后第一時間幫助解決 一. Centos 7 LVM xfs文件系統修復 情況1&#xff1a; [sda] Assuming drive cache:…

Bean基本注解開發

Commponent 使用Component注解代替<bean>標簽 <!--注解掃描:掃描指定的基本包及其子包下的類&#xff0c;識別使用了Component注解的文件--><context:component-scan base-package"org.xfy"></context:component-scan> package org.xfy.Dao.…

【Web】preg_match繞過相關例題wp

目錄 ①[FBCTF 2019]rceservice ②[ctfshow]web130 ③[ctfshow]web131 ④[NISACTF 2022]middlerce 簡單回顧一下基礎 參考文章 p牛神文 preg_match繞過總的來講就三塊可利用 數組繞過、PCRE回溯次數限制、換行符 ①[FBCTF 2019]rceservice 先貼出附件給的源碼 &l…

使用electron工具打包web端到PC端應用程序

根據electron官網快速入門示例可以方便的構建mac端包&#xff0c;我們在此基礎上構建windows端exe包. 1在package.json文件的script字段增加以下配置 "scripts": {..."build": "electron-builder --win"}, 2然后在終端執行以下命令 npm run b…

Modbus TCP

Modbus &#xff08;&#x1f446; 百度百科&#xff0c;放心跳轉&#xff09; 起源 Modbus 由 Modicon 公司于 1979 年開發&#xff0c;是一種工業現場總線協議標準。 Modbus 通信協議具有多個變種&#xff0c;支持串口&#xff0c;以太網多個版本&#xff0c;其中最著名的…

基于STM32的數字圖像處理與模式識別算法優化

基于STM32的數字圖像處理與模式識別算法優化是一項涉及圖像處理和機器學習領域的研究任務&#xff0c;旨在實現高效的圖像處理和模式識別算法在STM32微控制器上的運行。本文將介紹基于STM32的數字圖像處理與模式識別算法優化的原理和實現步驟&#xff0c;并提供相應的代碼示例。…