c语言的通讯录

使用单链写的通讯录,还是有些小问题,比如编号删除的时候会留下缺口。需改进


#include <stdio.h>

#include <stdlib.h>
#include <string.h>




#define T 1
#define F -1


typedef char type;
typedef struct contact* Node;
typedef int status;


struct contact
{
int id;
char name[20];
char tel[20];
struct contact* next;
};


void print(Node head);
status init(Node* head);
status intail(Node head, int id, type name[], type tel[]);
status inhead(Node head, int id, type name[], type tel[]);
status inmid(Node head, int x, int id, type name[], type tel[]);
status length(Node head);
void findid(Node head, int id);
void findname(Node head, type name[]);
void findtel(Node head, type tel[]);
void deltel(Node head, type tel[]);
void delid(Node head, int x);
void delname(Node head, type name[]);
void updateid(Node head, int x, type name[], type tel[]);
void updatename(Node head, type x[], type name[], type tel[]);
void updatetel(Node head, type x[], type name[], type tel[]);
void sortid(Node head);
void sorttel(Node head);
void sortname(Node head);


void sortid(Node head)
{
int j = length(head);
int i, k;


for (; j > 1; j--)
{
Node temp = head;
for (i = 1; i < j; i++)
{
if (temp->next->id > temp->next->next->id)
{
Node asd = temp->next->next->next;
Node dsa = temp->next->next;
temp->next->next->next = temp->next;
temp->next->next = asd;
temp->next = dsa;
}
temp = temp->next;
}
}
}




void sortname(Node head)
{
int j = length(head);
int i, k;


for (; j > 1; j--)
{
Node temp = head;
for (i = 1; i < j; i++)
{
if (strcmp(temp->next->name,temp->next->next->name) == 1)
{
Node asd = temp->next->next->next;
Node dsa = temp->next->next;
temp->next->next->next = temp->next;
temp->next->next = asd;
temp->next = dsa;
}
temp = temp->next;
}
}
}
void sorttel(Node head)
{
int j = length(head);
int i, k;


for (; j > 1; j--)
{
Node temp = head;
for (i = 1; i < j; i++)
{
if (strcmp(temp->next->tel,temp->next->next->tel) == 1)
{
Node asd = temp->next->next->next;
Node dsa = temp->next->next;
temp->next->next->next = temp->next;
temp->next->next = asd;
temp->next = dsa;
}
temp = temp->next;
}
}
}




int js = 1;




int main()
{
    int i;
int id;
type name[20];
type tel[20];
type x[20];


Node head = NULL;
init(&head);
int back = 1;


while(back)
{   


begin();
i = 0;
fflush(stdin);
scanf("%d", &i);


switch(i)
{
case 1:
{
printf("Give the Name, Telephone.(Name Telephone)\n");
fflush(stdin);
scanf("%s %s", name, tel);
intail(head, js++, name, tel);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
case 2:
{
printf("What do you want to delete by?\n1.ID\n2.Name\n3.Telephone\n");
fflush(stdin);
scanf("%d", &i);
switch(i)
{
case 1:
{
printf("ID is :\n");
fflush(stdin);
scanf("%d",&id);
delid(head, id);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
case 2:
{
printf("Name is :\n");
fflush(stdin);
scanf("%s",name);
delname(head, name);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
case 3:
{
printf("Telephone is :\n");
fflush(stdin);
scanf("%s", tel);
deltel(head, tel);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
default:printf("Wrong\n");back = 0;
}
break;
}
case 3:
{
printf("What do you want to search by?\n1.ID\n2.Name\n3.Telephone\n");
fflush(stdin);
scanf("%d", &i);
switch(i)
{
case 1:
{
printf("ID is :\n");
fflush(stdin);
scanf("%d",&id);
printf("***************************************\n");
findid(head, id);
printf("***************************************\n");
break;
}
case 2:
{
printf("Name is :\n");
fflush(stdin);
scanf("%s",name);
printf("***************************************\n");
findname(head, name);
printf("***************************************\n");
break;
}
case 3:
{
printf("Telephone is :\n");
fflush(stdin);
scanf("%s", tel);
printf("***************************************\n");
findtel(head, tel);
printf("***************************************\n");
break;
}
default:printf("Wrong\n");back = 0;
}
break;
}
case 4:
{
printf("What do you want to Change by?\n1.ID\n2.Name\n3.Telephone\n");
fflush(stdin);
scanf("%d", &i);
switch(i)
{
case 1:
{
printf("ID is :\n");
fflush(stdin);
scanf("%d",&i);
printf("Changing the Name, Telephone.(Name Telephone)\n");
fflush(stdin);
scanf("%s %s", name, tel);
updateid(head, i, name, tel);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
case 2:
{
printf("Name is :\n");
fflush(stdin);
scanf("%s",x);
printf("Changing the Name, Telephone.(Name Telephone)\n");
fflush(stdin);
scanf("%s %s", name, tel);
updatename(head, x, name, tel);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
case 3:
{
printf("Telephone is :\n");
fflush(stdin);
scanf("%s", x);
printf("Changing the Name, Telephone.(Name Telephone)\n");
fflush(stdin);
scanf("%s %s", name, tel);
updatetel(head, x, name, tel);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
default:printf("Wrong\n");back = 0;
}
break;
}
case 5:
{
printf("What do you want to sort contacts by?\n1.ID\n2.Name\n3.Telephone\n");
fflush(stdin);
scanf("%d", &i);
switch(i)
{
case 1:
{
sortid(head);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
case 2:
{
sortname(head);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
case 3:
{
sorttel(head);
printf("***************************************\n");
print(head);
printf("***************************************\n");
break;
}
default:printf("Wrong.\n");back = 0;
}
break;
}
case 6:printf("Thanks for using.\n");
  return 0;
default:printf("Wrong.\n");back = 0;

}
}




return 0;


}


int begin()
{
printf("***********************\n");
printf("*1.Add a contact      *\n");
printf("*2.delete a contact   *\n");
printf("*3.search a contac    *\n");
printf("*4.Change a contact   *\n");
printf("*5.Print contact(s)   *\n");
printf("*6.End the process    *\n");
printf("***********************\n");


printf("Choose one option,please.(like: 1)\n");


return 0;
}




void print(Node head)
{
Node temp = head;
while (temp->next != NULL)
{
printf("%d %s %s\n",temp->next->id,temp->next->name,temp->next->tel);
temp = temp->next;
}
printf("\n");
}






status intail(Node head, int id, type name[], type tel[])
{


while (head->next != NULL)
{
head = head->next;
}
Node new = (Node)malloc(sizeof(struct contact));
if (NULL == new)
{
return F;
}
new->next = NULL;
new->id = id;
strcpy(new->name, name);
strcpy(new->tel, tel);
head->next = new;







    return T;
}





status init(Node* head)
{
Node new = (Node)malloc(sizeof(struct contact));
if (NULL == new)
{
return F;
}
new->next = NULL;
new->id = 0;
strcpy(new->tel, "0");
strcpy(new->name, "0");


*(head) = new;


    return T;
}


status inhead(Node head, int id, char name[],type tel[])
{
Node temp = head->next;
Node newnode = (Node)malloc(sizeof(struct contact));
if (NULL == newnode)
{
return F;
}
newnode->next = temp;
newnode->id = id;
strcpy(newnode->name,name);
strcpy(newnode->tel,tel);
head->next = newnode;


  return T;
}


status length(Node head)
{
int c = 0;
Node temp = head;
while (temp->next != NULL)
{
temp = temp->next;
c++;
}
return c;
}


status inmid(Node head, int x, int id, type name[], type tel[])
{
if (x < 0 || x > length(head))
{
printf("Sorry,out of range.\n");
return F;
}
int i;


Node new = (Node)malloc(sizeof(struct contact));
Node temp = head;


for (i = 0; i < x; i++)
{
temp = temp->next;
}
new->next = temp->next;
temp->next = new;
new->id = id;
strcpy(new->name, name);
strcpy(new->tel, tel);


return T;
}




void delid(Node head, int x)
{
int i, j = length(head);
Node temp = head;


while (temp->next->id != x)
{
temp = temp->next;
}
Node temp2 = temp->next->next;
free(temp->next);
temp->next = temp2;


}


void deltel(Node head, type tel[])
{
int i, j = length(head);
Node temp = head;


for (i = 0; i < j; i++)
{
if (strcmp(temp->next->tel, tel) == 0)
{
Node temp2 = temp->next->next;
free(temp->next);
temp->next = temp2;
}
else
{
temp = temp->next;
}
}
}


void delname(Node head, type name[])
{
int i, j = length(head);
Node temp = head;


for (i = 0; i < j; i++)
{
if (strcmp(temp->next->name, name) == 0)
{
Node temp2 = temp->next->next;
free(temp->next);
temp->next = temp2;
}
else
{
temp = temp->next;
}
}
}




void findid(Node head, int id)
{


Node temp = head;


if (id < js)
{
while (temp->next->id != id)
{
temp = temp->next;
}

printf("ID %d is %s,the telephone is %s.\n", id, temp->next->name, temp->next->tel);
}
else
{
printf("Sorry,not found.\n");
}
}


void findname(Node head, type name[])
{
int j = 0;
Node temp = head;


while(temp->next != NULL)
{
if (strcmp(temp->next->name, name) == 0)
{
printf("%s's ID is %d,the telephone is %s.\n", temp->next->name,temp->next->id, temp->next->tel);
j++;
}
temp = temp->next;
}
if (j == 0)
{
printf("Sorry,not found.\n");


}
}


void findtel(Node head, type tel[])
{
int j = 0;
Node temp = head;


while(temp->next != NULL)
{
if (strcmp(temp->next->tel, tel) == 0)
{
printf("%s is %s's telephone, the ID is %d.\n", temp->next->tel, temp->next->name, temp->next->id);
j++;
}
temp = temp->next;
}
if (j == 0)
{
printf("Sorry,not found.\n");


}
}




void updateid(Node head, int x, type name[], type tel[])
{
Node temp = head;
 
if (x < js)
{
while (temp->next->id != x)
{
temp = temp->next;
}
printf("ID:%d Name:%s telephone:%s.\n",temp->next->id, temp->next->name, temp->next->tel);


strcpy(temp->next->name, name);
strcpy(temp->next->tel, tel);

printf("After changed: ID:%d Name:%s telephone:%s.\n", x, temp->next->name, temp->next->tel);
}
else
{
printf("Sorry,not found.\n");


}
}


void updatename(Node head, type x[], type name[], type tel[])
{
Node temp = head;
int i = 0;


while(temp->next != NULL)
{
if (strcmp(temp->next->name,x) == 0)
{
printf("ID:%d Name:%s telephone:%s.\n",temp->next->id, temp->next->name, temp->next->tel);


strcpy(temp->next->name, name);
strcpy(temp->next->tel, tel);

printf("After changed: ID:%d Name:%s telephone:%s.\n",temp->next->id, temp->next->name, temp->next->tel);
i++;
}
temp = temp->next;
}
if (i == 0)
{
printf("Sorry,not found.\n");


}
}


void updatetel(Node head, type x[], type name[], type tel[])
{
Node temp = head;
int i = 0;


while(temp->next != NULL)
{
if (strcmp(temp->next->tel,x) == 0)
{
printf("ID:%d Name:%s telephone:%s.\n",temp->next->id, temp->next->name, temp->next->tel);


strcpy(temp->next->name, name);
strcpy(temp->next->tel, tel);

printf("After changed: ID:%d Name:%s telephone:%s.\n",temp->next->id, temp->next->name, temp->next->tel);
i++;
}
temp = temp->next;
}
if (i == 0)
{
printf("Sorry,not found.\n");


}
}

<think>我们被要求用C语言实现一个通讯录程序。根据引用内容,我们可以总结出通讯录需要包含以下功能:1.添加联系人2.删除联系人3.查找联系人4.修改联系人5.显示所有联系人6.按某种规则排序联系人7.退出通讯录此外,引用中给出了通讯录的数据结构设计:-每个联系人的信息(peoinfo)包括:姓名(name)、年龄(age)、性别(sex)、地址(addr)、电话(tele)-通讯录(contact)是一个包含多个联系人信息的数组(最大容量MAX=1000)和一个记录当前联系人数的变量(sz)我们按照模块化的思想,将程序分为三个文件:1.`contact.h`:声明类型和函数2.`contact.c`:函数的具体实现3.`test.c`:主函数,程序的入口下面我们分别实现这三个文件。###1.contact.h头文件```c#pragmaonce#include<stdio.h>#include<string.h>#include<assert.h>#defineMAX1000#defineNAME_MAX20#defineSEX_MAX6#defineADDR_MAX30#defineTELE_MAX13//联系人信息typedefstructPeoInfo{charname[NAME_MAX];intage;charsex[SEX_MAX];charaddr[ADDR_MAX];chartele[TELE_MAX];}PeoInfo;//通讯录typedefstructContact{PeoInfodata[MAX];//存储联系人信息的数组intsz;//当前通讯录中联系人的个数}Contact;//初始化通讯录voidInitContact(Contact*pc);//添加联系人voidAddContact(Contact*pc);//显示所有联系人voidShowContact(constContact*pc);//删除联系人voidDelContact(Contact*pc);//查找联系人(按名字)voidSearchContact(constContact*pc);//修改联系人voidModifyContact(Contact*pc);//排序通讯录(按名字)voidSortContact(Contact*pc);```###2.contact.c函数实现```c#include"contact.h"//初始化通讯录voidInitContact(Contact*pc){assert(pc);pc->sz=0;memset(pc->data,0,sizeof(pc->data));//将数组内容清零}//添加联系人voidAddContact(Contact*pc){assert(pc);if(pc->sz==MAX){printf("通讯录已满,无法添加\n");return;}printf("请输入姓名:");scanf("%s",pc->data[pc->sz].name);printf("请输入年龄:");scanf("%d",&(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s",pc->data[pc->sz].sex);printf("请输入地址:");scanf("%s",pc->data[pc->sz].addr);printf("请输入电话:");scanf("%s",pc->data[pc->sz].tele);pc->sz++;printf("添加成功\n");}//显示所有联系人voidShowContact(constContact*pc){assert(pc);if(pc->sz==0){printf("通讯录为空\n");return;}printf("%-10s\t%-5s\t%-6s\t%-20s\t%-15s\n","姓名","年龄","性别","地址","电话");for(inti=0;i<pc->sz;i++){printf("%-10s\t%-5d\t%-6s\t%-20s\t%-15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}}//查找联系人(按名字),返回找到的下标,没找到返回-1staticintFindByName(constContact*pc,constchar*name){assert(pc&&name);for(inti=0;i<pc->sz;i++){if(strcmp(pc->data[i].name,name)==0){returni;}}return-1;}//删除联系人voidDelContact(Contact*pc){assert(pc);if(pc->sz==0){printf("通讯录为空,无法删除\n");return;}charname[NAME_MAX];printf("请输入要删除的联系人姓名:");scanf("%s",name);intpos=FindByName(pc,name);if(pos==-1){printf("要删除的联系人不存在\n");return;}//将后面的数据前移for(inti=pos;i<pc->sz-1;i++){pc->data[i]=pc->data[i+1];}pc->sz--;printf("删除成功\n");}//查找联系人voidSearchContact(constContact*pc){assert(pc);charname[NAME_MAX];printf("请输入要查找的联系人姓名:");scanf("%s",name);intpos=FindByName(pc,name);if(pos==-1){printf("查无此人\n");return;}printf("%-10s\t%-5s\t%-6s\t%-20s\t%-15s\n","姓名","年龄","性别","地址","电话");printf("%-10s\t%-5d\t%-6s\t%-20s\t%-15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].addr,pc->data[pos].tele);}//修改联系人voidModifyContact(Contact*pc){assert(pc);charname[NAME_MAX];printf("请输入要修改的联系人姓名:");scanf("%s",name);intpos=FindByName(pc,name);if(pos==-1){printf("要修改的联系人不存在\n");return;}printf("请输入新的姓名:");scanf("%s",pc->data[pos].name);printf("请输入新的年龄:");scanf("%d",&(pc->data[pos].age));printf("请输入新的性别:");scanf("%s",pc->data[pos].sex);printf("请输入新的地址:");scanf("%s",pc->data[pos].addr);printf("请输入新的电话:");scanf("%s",pc->data[pos].tele);printf("修改成功\n");}//按姓名排序(使用strcmp比较)voidSortContact(Contact*pc){assert(pc);for(inti=0;i<pc->sz-1;i++){for(intj=0;j<pc->sz-1-i;j++){if(strcmp(pc->data[j].name,pc->data[j+1].name)>0){//交换两个联系人PeoInfotmp=pc->data[j];pc->data[j]=pc->data[j+1];pc->data[j+1]=tmp;}}}printf("排序完成\n");}```###3.test.c主函数```c#define_CRT_SECURE_NO_WARNINGS1#include"contact.h"voidmenu(){printf("**********************************\n");printf("***1.add2.del***\n");printf("***3.search4.modify***\n");printf("***5.show6.sort***\n");printf("***0.exit***\n");printf("**********************************\n");}intmain(){intinput=0;Contactcon;//通讯录//初始化通讯录InitContact(&con);do{menu();printf("请选择:");scanf("%d",&input);switch(input){case1:AddContact(&con);break;case2:DelContact(&con);break;case3:SearchContact(&con);break;case4:ModifyContact(&con);break;case5:ShowContact(&con);break;case6:SortContact(&con);break;case0:printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}}while(input);return0;}```###代码说明1.**数据结构**:通讯录(Contact)包含一个联系人数组(PeoInfo)和当前联系人数量(sz)。每个联系人包括姓名、年龄、性别、地址和电话。2.**功能模块**:-初始化:将通讯录清空。-添加:在数组末尾添加一个联系人,注意检查数组是否已满。-显示:以表格形式打印所有联系人。-删除:根据姓名查找并删除,删除后后面的元素前移。-查找:根据姓名查找并显示该联系人信息。-修改:根据姓名查找并修改该联系人的所有信息。-排序:按姓名升序排序(使用冒泡排序)。3.**辅助函数**:`FindByName`用于在数组中找到指定姓名的联系人位置。###编译运行将上述三个文件放在同一目录下,使用编译器(如gcc)进行编译:```bashgcctest.ccontact.c-ocontact```运行生成的可执行文件即可。###注意事项1.本程序使用字符串比较(`strcmp`)来查找和排序,因此姓名是区分大小写的。2.输入时,请注意每个字段的最大长度(在头文件中定义),避免溢出。3.删除操作后,数组后面的元素会前移,因此时间复杂度为$O(n)$。###改进方向1.可以增加文件存储功能,使通讯录数据持久化。2.可以增加按其他字段(如年龄、电话)排序的功能。3.可以增加修改和查找时按其他字段进行操作的选项。§§相关问题§§1.如何实现通讯录数据的持久化存储(如保存到文件)?2.通讯录程序如何防止输入的数据长度超过定义的最大长度?3.如何优化通讯录的查找效率(例如使用哈希表)?4.通讯录程序如何支持更多的联系人字段(如邮箱、备注等)?</think>### C语言实现通讯录功能详解 我将为您提供一个完整的C语言通讯录实现方案,包含核心功能模块和代码示例。 #### 数据结构设计 ```c // contact.h #define MAX 1000 // 最大联系人数量 #define NAME_MAX 20 // 姓名最大长度 #define SEX_MAX 6 // 性别最大长度 #define ADDR_MAX 30 // 地址最大长度 #define TELE_MAX 13 // 电话最大长度 // 联系人信息结构体 typedef struct PeoInfo { char name[NAME_MAX]; int age; char sex[SEX_MAX]; char addr[ADDR_MAX]; char tele[TELE_MAX]; } PeoInfo; // 通讯录结构体 typedef struct Contact { PeoInfo data[MAX]; // 联系人数组 int sz; // 当前联系人数量 } Contact; ``` #### 核心功能实现 ```c // contact.c #include "contact.h" #include <stdio.h> #include <string.h> #include <assert.h> // 初始化通讯录 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0, MAX * sizeof(PeoInfo)); } // 添加联系人 void AddContact(Contact* pc) { assert(pc); if (pc->sz >= MAX) { printf("通讯录已满,无法添加\n"); return; } printf("请输入姓名: "); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄: "); scanf("%d", &pc->data[pc->sz].age); printf("请输入性别: "); scanf("%s", pc->data[pc->sz].sex); printf("请输入地址: "); scanf("%s", pc->data[pc->sz].addr); printf("请输入电话: "); scanf("%s", pc->data[pc->sz].tele); pc->sz++; printf("添加成功!\n"); } // 显示所有联系人 void ShowContact(const Contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } printf("%-10s\t%-5s\t%-6s\t%-20s\t%-15s\n", "姓名", "年龄", "性别", "地址", "电话"); for (int i = 0; i < pc->sz; i++) { printf("%-10s\t%-5d\t%-6s\t%-20s\t%-15s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele); } } // 查找联系人(按姓名) static int FindByName(const Contact* pc, const char* name) { for (int i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; // 返回找到的索引 } } return -1; // 未找到 } // 删除联系人 void DelContact(Contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } char name[NAME_MAX]; printf("请输入要删除的联系人姓名: "); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("联系人不存在\n"); return; } // 将后续元素前移 for (int i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功!\n"); } // 修改联系人 void ModifyContact(Contact* pc) { assert(pc); char name[NAME_MAX]; printf("请输入要修改的联系人姓名: "); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("联系人不存在\n"); return; } printf("修改联系人信息:\n"); printf("新姓名: "); scanf("%s", pc->data[pos].name); printf("新年龄: "); scanf("%d", &pc->data[pos].age); printf("新性别: "); scanf("%s", pc->data[pos].sex); printf("新地址: "); scanf("%s", pc->data[pos].addr); printf("新电话: "); scanf("%s", pc->data[pos].tele); printf("修改成功!\n"); } ``` #### 主程序入口 ```c // main.c #include "contact.h" #include <stdio.h> void menu() { printf("\n**********************************\n"); printf("*** 1.添加 2.删除 3.查找 ***\n"); printf("*** 4.修改 5.显示 6.排序 ***\n"); printf("*** 0.退出 ***\n"); printf("**********************************\n"); } int main() { Contact con; InitContact(&con); int input = 0; do { menu(); printf("请选择操作: "); scanf("%d", &input); switch(input) { case 1: AddContact(&con); break; case 2: DelContact(&con); break; case 3: // 查找功能实现 break; case 4: ModifyContact(&con); break; case 5: ShowContact(&con); break; case 6: // 排序功能实现 break; case 0: printf("退出通讯录\n"); break; default: printf("无效选择\n"); } } while (input != 0); return 0; } ``` ### 功能说明 1. **数据结构**:使用结构体数组存储联系人信息,包含姓名、年龄、性别等字段[^4] 2. **核心操作**: - 初始化:清空通讯录并重置计数器 - 添加:交互式输入新联系人信息 - 显示:表格形式展示所有联系人 - 删除:按姓名查找并删除 - 修改:按姓名查找并更新信息 3. **交互界面**:通过菜单系统提供用户友好的操作体验[^2] ### 编译运行 1. 创建三个文件:`contact.h`、`contact.c`、`main.c` 2. 使用编译器编译: ```bash gcc main.c contact.c -o contact_system ``` 3. 运行程序: ```bash ./contact_system ``` ### 扩展建议 1. 增加文件存储功能,实现数据持久化 2. 添加按多种条件排序(姓名、年龄等) 3. 实现模糊搜索功能 4. 增加数据验证(如电话号码格式检查)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值