電話簿管理
設(shè)計一個學(xué)生通信錄,學(xué)生通迅錄數(shù)據(jù)信息構(gòu)成內(nèi)容可自行設(shè)計(如:姓名、家庭地址、郵政編碼、電話號碼等等)。該學(xué)生通信錄電管理程序具有加入、刪除、顯示和查詢等功能。
//頭文件的包含
#include#include#include//宏定義
//學(xué)生信息結(jié)構(gòu)的定義
typedef struct student
{int num;//以學(xué)號排序
char logo[20];//群組分類功能——標(biāo)簽
char name[20];
char address[50];
int PostalCode;
char PhoneCode[12];
struct student* next;
}STU;
//函數(shù)的聲明
//創(chuàng)建學(xué)生信息鏈表
STU* create();
//添加學(xué)生的信息
STU* append(STU* head, STU* new);
//修改學(xué)生的信息
STU* modify(STU* head, char name[]);
//刪除一條、一個群組、全部記錄
STU* delete(STU* head, int choice);
//對數(shù)據(jù)進(jìn)行保存
void save(FILE* fp, STU* head);
//查找
void find(STU* head, int choice);
//顯示通訊錄信息
void output(STU* head);
fun.c#define _CRT_SECURE_NO_WARNINGS
#include"fun.h"
STU* create()
{STU* head = NULL;//頭指針——NULL表示表為空
STU* p;//用來創(chuàng)建結(jié)點(diǎn)的
while (1)
{//對創(chuàng)建一個學(xué)生的結(jié)點(diǎn)動態(tài)分配空間
if ((p = (STU*)malloc(sizeof(STU))) == NULL)
{ printf("No space available.Create failed.\n");
exit(1);
}
printf("請輸入一位學(xué)生的學(xué)號(輸入0退出):");
scanf("%d", &p->num);
if (p->num == 0)
{ break;
}
printf("該學(xué)生分組為:");
scanf("%s", p->logo);
printf("姓名為:");
scanf("%s", p->name);
printf("家庭地址為:");
scanf("%s", p->address);
printf("郵政編號為:");
scanf("%d", &p->PostalCode);
printf("電話號碼為:");
scanf("%s", p->PhoneCode);
head = append(head, p); //創(chuàng)建一個學(xué)生的結(jié)點(diǎn)后,以學(xué)號為標(biāo)準(zhǔn)進(jìn)行插入,從而實(shí)現(xiàn)排序功能
}
return head;
}
STU* append(STU* head, STU* new)
{STU* p = head, *q=NULL;
if (head == NULL)//原表為空
{new->next = NULL;
return new;
}
else
{//查找關(guān)鍵結(jié)點(diǎn)
while (p->num< new->num)//學(xué)號從小到大排序
{ q = p;
p = p->next;
if (p == NULL)
{ break;
}
}
//把新結(jié)點(diǎn)插到表頭前
if (p == head)
{ new->next = head;
return new;
}
//把新結(jié)點(diǎn)插入表尾
else if (p == NULL)
{ q->next = new;
new->next = NULL;
}
//從中間插入新結(jié)點(diǎn)
else
{ q->next = new;
new->next = p;
}
}
return head;
}
//修改學(xué)生的信息
STU* modify(STU* head, char name[])
{STU* p = head;
while (strcmp(p->name, name) != 0)//尋找該學(xué)生
{p = p->next;
if (p == NULL)
break;
}
if (p == NULL)
{printf("要修改的學(xué)生不存在!\n");
}
else
{while (1)
{ int choice;
printf("要修改信息:1.組別 2.學(xué)號 3.電話 4.郵政編號 5.家庭地址\n");
printf("請選擇要修改的操作,輸入0退出修改:\n");
scanf("%d", &choice);
switch (choice)
{ case 1:
printf("修改成:");
scanf("%s", p->logo);
break;
case 2:
printf("修改成:");
scanf("%d", &p->num);
break;
case 3:
printf("修改成:");
scanf("%s", p->PhoneCode);
break;
case 4:
printf("修改成:");
scanf("%d", &p->PostalCode);
break;
case 5:
printf("修改成:");
scanf("%s", p->address);
break;
case 0:
return head;
default:
printf("輸入數(shù)據(jù)非法,請重新輸入\n");
}
}
}
}
//刪除一條、一個群組、全部記錄
STU* delete(STU* head, int choice)
{STU* p = head, * q = NULL;
if (choice == 1)
{char name[20];
printf("請輸入要刪除學(xué)生的姓名:");
scanf("%s", name);
while (strcmp(p->name, name) != 0)//尋找該學(xué)生
{ q = p;
p = p->next;
if (p == NULL)
break;
}
if (p == NULL)
{ printf("要刪除的學(xué)生不存在!\n");
}
//要刪除的學(xué)生是表頭
else if (p == head)
{ head = head->next;
free(p);
p = NULL;
}
else
{ q->next = p->next;
free(p);
p = NULL;
}
}
else if (choice == 2)
{p = head->next;
char logo[20];
printf("請輸入要刪除的群組名:");
scanf("%s", logo);
while (p != NULL)//遍歷除了表頭的整個通訊錄
{ //找到組別為要刪除的群組名就執(zhí)行
if (strcmp(p->logo, logo) == 0)
{ q = p;
p = p->next;
free(q);
q = p;
p = p->next;
}
else
{ q = p;
p = p->next;
}
}
if (strcmp(head->logo, logo) == 0)//對表頭進(jìn)行判斷
{ free(head);
head = NULL;
}
}
else if (choice == 3)
{while (head != NULL)
{ q = head->next;
free(head);
head = q;
}
head = NULL;
}
else
{printf("輸入數(shù)據(jù)錯誤,無法實(shí)現(xiàn)刪除操作\n");
}
return head;
}
//數(shù)據(jù)保存
void save(FILE* fp, STU* head)
{//以寫的方式打開文件
if ((fp = fopen("student_contract.txt", "w")) == NULL)
{printf("打開文件錯誤!\n");
return;
}
//對數(shù)據(jù)保存
STU* p = head;
fprintf(fp,"組別\t學(xué)號\t姓名\t電話號碼\t\t郵政編碼\t家庭住址\n");
while (p != NULL)
{fprintf(fp,"%s\t%d\t%s\t%s\t%d\t\t%s\n", p->logo, p->num, p->name, p->PhoneCode, p->PostalCode, p->address);
p = p->next;
}
fclose(fp);
}
//查找
//模糊查找子函數(shù)實(shí)現(xiàn)
int is_have_same_key(char input[],char name[])
{char* p = input, * q = name;
while (*p != '\0')//從輸入的名字的第一個漢字開始遍歷整個名字
{q = name;//確保每次遍歷名字的指針從頭開始
while (*q != '\0')
{ if (*p == *q)
{ return 1;//但凡找到有和輸入名字相同的關(guān)鍵字,返回值1,查找成功
}
q++;
}
p++;
}
return 0;//沒有找到,返回值0,查找失敗
}
void find(STU* head, int choice)
{if (choice == 1)//精準(zhǔn)查找
{STU* p = head;
char name[20];
printf("請輸入查找的學(xué)生的確切名字:");
scanf("%s", name);
while (p != NULL)
{ if ((strcmp(p->name, name)) == 0)
{ printf("找到了,詳細(xì)信息如下\n");
printf("\n組別:%s\n", p->logo);
printf("學(xué)號:%d\n", p->num);
printf("姓名:%s\n", p->name);
printf("電話號碼:%s\n", p->PhoneCode);
printf("郵政編碼:%d\n", p->PostalCode);
printf("家庭住址:%s\n", p->address);
break;
}
p = p->next;
}
if (p == NULL)
{ printf("很抱歉,該學(xué)生的信息不存在\n");
return;
}
}
else if (choice == 2)//模糊查找
{STU* p = head, * q = NULL;
char name[20];
int i = 0;
printf("請輸入所知名字信息:");
scanf("%s", name);
//遍歷整個鏈表
while (p != NULL)
{ if (is_have_same_key(name, p->name))
{ printf("\n(模糊查詢)學(xué)生%d信息\n", ++i);
printf("\n組別:%s\n", p->logo);
printf("學(xué)號:%d\n", p->num);
printf("姓名:%s\n", p->name);
printf("電話號碼:%s\n", p->PhoneCode);
printf("郵政編碼:%d\n", p->PostalCode);
printf("家庭住址:%s\n", p->address);
}
p = p->next;
}
if (i == 0)
{ printf("很抱歉,該學(xué)生的信息不存在\n");
}
}
else
printf("輸入數(shù)據(jù)錯誤,該操作無法實(shí)行\(zhòng)n");
}
//顯示通訊錄信息
void output(STU* head)
{if (head == NULL)
{printf("沒有信息,請創(chuàng)建并輸入信息吧!\n");
return;
}
int choice;
STU* p = head;
char logo[20];//用來輸出特定的組別的
int juge = 0;//用來判斷特定組別是否信息
while (1)
{printf("1.以列表的形式顯示。2.以頁面的形式顯示。3.顯示特定群組。0.退出顯示。\n");
printf("請選擇:");
scanf("%d", &choice);
p = head;
switch (choice)
{case 1:
printf("組別\t學(xué)號\t姓名\t電話號碼\t郵政編碼\t家庭住址\n");
while (p != NULL)
{ printf("%s\t%d\t%s\t%s\t%d\t\t%s\n", p->logo, p->num, p->name, p->PhoneCode, p->PostalCode, p->address);
p = p->next;
}
break;
case 2:
while (p != NULL)
{ printf("\n組別:%s\n", p->logo);
printf("學(xué)號:%d\n", p->num);
printf("姓名:%s\n", p->name);
printf("電話號碼:%s\n", p->PhoneCode);
printf("郵政編碼:%d\n", p->PostalCode);
printf("家庭住址:%s\n", p->address);
p = p->next;
}
break;
case 3:
printf("請輸入想要輸入的組別:");
scanf("%s", logo);
printf("組別\t學(xué)號\t姓名\t電話號碼\t\t郵政編碼\t家庭住址\n");
while (p != NULL)
{ if ((strcmp(logo, p->logo)) == 0)
{printf("%s\t%d\t%s\t%s\t%d\t%s\n", p->logo, p->num, p->name, p->PhoneCode, p->PostalCode, p->address);
juge = 1;
}
p = p->next;
}
if (juge == 0)
{ printf("不存在該組別\n");
}
break;
case 0:
return;
default:
printf("輸入數(shù)據(jù)違法,請重新輸入。\n");
break;
}
}
}
text.c#define _CRT_SECURE_NO_WARNINGS
#include "fun.h"
void menu()
{printf("******************************\n");
printf("***** 電話簿管理系統(tǒng) ***\n");
printf("************0.退出************\n");
printf("************1.創(chuàng)建************\n");
printf("************2.增加************\n");
printf("************3.修改************\n");
printf("************4.刪除************\n");
printf("************5.保存************\n");
printf("************6.查看************\n");
printf("************7.找人************\n");
printf("***** 電話簿管理系統(tǒng) ***\n");
printf("******************************\n");
}
int main()
{STU* head = NULL,*p;
char name[20];
FILE* fp=NULL;
int choice;//操作選擇
while (1)
{menu();
printf("請輸入要進(jìn)行的操作(0~5):");
scanf("%d", &choice);
switch (choice)
{case 0:
goto end;
break;
case 1:
head=create();
break;
case 2://添加學(xué)生信息——建立通訊錄
//對創(chuàng)建一個學(xué)生的結(jié)點(diǎn)動態(tài)分配空間
if ((p = (STU*)malloc(sizeof(STU))) == NULL)
{ printf("No space available.Create failed.Please select again.\n");
}
else
{ printf("請輸入新學(xué)生的學(xué)號:");
scanf("%d", &p->num);
printf("該學(xué)生分組為:");
scanf("%s", p->logo);
printf("姓名為:");
scanf("%s", p->name);
printf("家庭地址為:");
scanf("%s", p->address);
printf("郵政編號為:");
scanf("%d", &p->PostalCode);
printf("電話號碼為:");
scanf("%s", p->PhoneCode);
head = append(head, p);
}
break;
case 3://修改學(xué)生中的信息
printf("請輸入要修改信息學(xué)生的名字:");
scanf("%s", name);
head=modify(head,name);
break;
case 4://刪除一條、一個群組、全部記錄
printf("1.刪除一條記錄 2.刪除一個群組記錄 3.刪除全部記錄\n");
printf("請選擇刪除操作:");
scanf("%d", &choice);
head=delete(head,choice);
break;
case 5://對數(shù)據(jù)進(jìn)行保存
save(fp,head);
break;
case 6://多種形式的顯示
output(head);
break;
case 7://查找——精準(zhǔn)查找和模糊查找
printf("1.精準(zhǔn)查找 2.模糊查找\n");
printf("請選擇:");
scanf("%d", &choice);
find(head,choice);
break;
default:
printf("輸入數(shù)據(jù)非法,請重新輸入\n");
break;
}
}
end:
//釋放動態(tài)內(nèi)存空間
{STU* q=NULL;
while (head != NULL)
{ q = head->next;
free(head);
head = q;
}
head = NULL;
}
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:大一c語言程序設(shè)計——電話簿管理-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://chinadenli.net/article6/cepgig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、定制網(wǎng)站、品牌網(wǎng)站設(shè)計、移動網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容