目錄
在長達一個多月的學習過程中,終于將C語言學完,因此專門寫一個C語言課程設計來檢驗這一個多月的學習成果,由于寫的比較急,因此代碼有些還可以優化的地方,還請諒解!下面會對每個函數塊的作用以及實現方法做出簡單的論述。
菜單功能
函數作用:通過menu()函數來調用其他要使用到的功能。并在執行完以后重新返回該函數。
實現方法:主要通過goto語句,語句以及函數的調用三種方法來實現該功能。
void menu(){
system("cls");
printf(" ---------------------------------\n");
printf(" ----------通訊錄管理系統----------\n");
printf(" ----------1、錄入信息 ---------\n");
printf(" ----------2、查看全部信息---------\n");
printf(" ----------3、查看單個信息---------\n");
printf(" ----------4、刪除全部信息---------\n");
printf(" ----------5、刪除單個信息---------\n");
printf(" ----------6、修改單個信息---------\n");
printf(" ----------7、退出系統 ---------\n");
int choice;
printf("選擇任意一個功能:\n");
loop:
scanf("%d",&choice);
switch (choice){
case 1:
add_people();
menu();
case 2:
views_people();
menu();
case 3:
view_people();
menu();
break;
case 4:
delall_people();
menu();
case 5:
del_people();
menu();
case 6:
revise_people();
menu();
case 7:
exit(1);
break;
default:
printf("輸入錯誤!請重新輸入:");
goto loop;
}
}
錄入聯系人信息功能
函數作用:在使用其他功能之前,應當先將部分信息存儲在管理系統中,從而才可以實現數據的增刪改查。
實現方法:主要通過動態鏈表的創建而實現,首先創建結構體指針p1,p2,并通過()函數獲取空間,其中p1作為首指針,p2作為尾指針。在p1所指向的結構體獲取數據之后,令p2所指向的結構體中的next指針,指向p1結構體的地址c語言通訊錄系統,這步操作完成之后,p1將其地址賦值給p2.隨后p1再次通過()函數獲取一定的空間c語言通訊錄系統,在p1指向的結構體獲取數據之后,重復之前的操作,直至不再開辟新的空間時停止,最后將NULL賦值給最后一個結構體中next指針,使其不再指向任何地址。
void add_people(){ //添加信息
system("cls");
int count;
printf("選擇要添加聯系人個數:\n");
scanf("%d",&count);
struct People *p1,*p2;
p1=p2=(struct People*)malloc(LEN);
int i=0;
printf("------------------------------------\n");
if(head==NULL){
head = p1;
}else{
end->next = p1 ;
}
while(count>0){
printf("請輸第%d個聯系人信息:\n",++i);
printf("姓名:\n");
scanf("%s",&p1->name);
printf("性別:\n");
scanf("%s",&p1->sex);
printf("電話號碼:\n");
scanf("%d",&p1->num);

printf("郵箱:\n");
scanf("%s",&p1->email);
printf("家庭地址:\n");
scanf("%s",&p1->addr);
count--;
p2->next=p1;
p2=p1;
p1=(struct People*)malloc(LEN);
system("cls");
}
p2->next=NULL;
end=p2;
printf("全部添加成功!\n");
system("pause");
}
查看系統中全部信息功能
函數作用:將通訊錄系統中所有數據呈現出來。
實現方法:定義一個結構體指針變量(局部變量)pt,將頭指針head賦值給pt,通過循環輸出pt指針所指向的結構體,并將所指向結構體中的next所指向的地址賦值給pt,從而實現對下一個結構體的訪問。
void views_people(){ //查看全部信息
system("cls");
struct People *pt;
if(head!=NULL){
for(pt=head;pt!=NULL;){
printf("姓名:%s\n性別:%s\n電話號碼:%d\n郵箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);
pt=pt->next;
printf("-------------------------------------------------------------\n");
}
}else{
printf("該系統中無數據!");
}
system("pause");
}
查看單個信息功能
函數作用:有目的性地尋找聯系人的所有信息。
實現方法:將鏈表中的數據一一遍歷,與所輸入的數據進行對比,若匹配成功,則將該指針所指向結構體中的數據輸出。
void view_people(){ //單個查詢,通過名字查詢
system("cls");
struct People *pt;
printf("輸入要查詢的聯系人名字:\n");
char name[10];
int flag=1;
scanf("%s",&name);
for(pt=head;pt!=NULL;){
if(strcmp(pt->name,name)==0){
printf("成功找到!\n");
printf("姓名:%s\n性別:%s\n電話號碼:%d\n郵箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);
flag=0;
break;
}
pt=pt->next;
}
if(flag){
printf("不好意思,未找到!\n");
}
system("pause");
}
刪除全部信息功能
函數作用:將管理系統中的所有數據刪除。
實現方法:仍然是對鏈表一一遍歷,在遍歷的過程中通過free()函數將其開辟的空間釋放,從而達到數據刪除的作用。
void delall_people(){ //全部刪除
system("cls");
printf("正在刪除中···\n");
system("pause");
struct People *pt;
for(pt=head;pt!=NULL;){
struct People *temp=pt;
pt=pt->next;
free(pt);
}
head=NULL;
end=NULL;
printf("刪除成功!\n");

system("pause");
}
刪除單個信息功能
函數作用:有目的性地刪除一些失效信息
實現方法:依然是通過遍歷找到想要刪除的指針,不過在這之前應該定義一個結構體指針用來獲取pt的地址。其目的是為了能夠在刪除該指針之前將該指針之前的數據與之后的數據能夠連接起來。
void del_people(){ //刪除單個聯系人信息
system("cls");
struct People *pt,*temp;
pt=head;
printf("請輸入要刪除的聯系人:");
char name[10];
scanf("%s",&name);
int flag=1;
while(pt!=NULL){
if(strcmp(name,pt->name)==0){
if(pt==head){
head = pt->next;
flag = 0;
printf("刪除成功!\n");
system("pause");
}else{
printf("刪除成功···\n");
system("pause");
temp->next=pt->next;
free(pt);
flag=0;
break;
}
}
temp=pt;
pt=pt->next;
}
if(flag){
printf("不好意思,未找到!\n");
system("pause");
}
}
修改信息功能
函數作用:修改通訊錄管理系統中的一些錯誤信息
實現方法:其核心依然是通過遍歷找到要修改的指針,從而實現對數據的修改。
void del_people(){ //刪除單個聯系人信息
system("cls");
struct People *pt,*temp;
pt=head;
printf("請輸入要刪除的聯系人:");
char name[10];
scanf("%s",&name);
int flag=1;
while(pt!=NULL){
if(strcmp(name,pt->name)==0){
printf("刪除成功···\n");
system("pause");
temp->next=pt->next;
free(pt);
flag=0;
break;
}
temp=pt;
pt=pt->next;
}
if(flag){
printf("不好意思,未找到!\n");
system("pause");
}
}
完整代碼
#include
#include
#include
#include
#define LEN sizeof(struct People)

struct People{
char name[10]; //姓名
char sex[4]; //性別
int num; //電話號碼
char email[20]; //郵箱
char addr[30]; //家庭地址
struct People* next;
};
struct People* head =NULL;
struct People* end =NULL;
void add_people(){ //添加信息
system("cls");
int count;
printf("選擇要添加聯系人個數:\n");
scanf("%d",&count);
struct People *p1,*p2;
p1=p2=(struct People*)malloc(LEN);
int i=0;
printf("------------------------------------\n");
if(head==NULL){
head = p1;
}else{
end->next = p1 ;
}
while(count>0){
printf("請輸第%d個聯系人信息:\n",++i);
printf("姓名:\n");
scanf("%s",&p1->name);
printf("性別:\n");
scanf("%s",&p1->sex);
printf("電話號碼:\n");
scanf("%d",&p1->num);
printf("郵箱:\n");
scanf("%s",&p1->email);
printf("家庭地址:\n");
scanf("%s",&p1->addr);
count--;
p2->next=p1;
p2=p1;
p1=(struct People*)malloc(LEN);
system("cls");
}
p2->next=NULL;
end=p2;
printf("全部添加成功!\n");
system("pause");
}
void views_people(){ //查看全部信息
system("cls");
struct People *pt;
if(head!=NULL){
for(pt=head;pt!=NULL;){
printf("姓名:%s\n性別:%s\n電話號碼:%d\n郵箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);
pt=pt->next;
printf("-------------------------------------------------------------\n");
}
}else{
printf("該系統中無數據!");
}
system("pause");
}
void delall_people(){ //全部刪除
system("cls");
printf("正在刪除中···\n");
system("pause");
struct People *pt;
for(pt=head;pt!=NULL;){
struct People *temp=pt;
pt=pt->next;
free(pt);
}
head=NULL;

end=NULL;
printf("刪除成功!\n");
system("pause");
}
void view_people(){ //單個查詢,通過名字查詢
system("cls");
struct People *pt;
printf("輸入要查詢的聯系人名字:\n");
char name[10];
int flag=1;
scanf("%s",&name);
for(pt=head;pt!=NULL;){
if(strcmp(pt->name,name)==0){
printf("成功找到!\n");
printf("姓名:%s\n性別:%s\n電話號碼:%d\n郵箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);
flag=0;
break;
}
pt=pt->next;
}
if(flag){
printf("不好意思,未找到!\n");
}
system("pause");
}
void revise_people(){ //修改內容
system("cls");
struct People *pt;
printf("輸入要修改的聯系人名字:\n");
char name[10];
int flag=1;
scanf("%s",&name);
for(pt=head;pt!=NULL;){
if(strcmp(name,pt->name)==0){
printf("成功找到!\n");
printf("姓名:%s\n性別:%s\n電話號碼:%d\n郵箱:%s\n家庭地址:%s\n",pt->name,pt->sex,pt->num,pt->email,pt->addr);
flag=0;
printf("請分別進行修改:\n");
printf("姓名:\n");
scanf("%s",&pt->name);
printf("性別:\n");
scanf("%s",&pt->sex);
printf("電話號碼:\n");
scanf("%d",&pt->num);
printf("郵箱:\n");
scanf("%s",&pt->email);
printf("家庭地址:\n");
scanf("%s",&pt->addr);
break;
}
pt=pt->next;
}
if(flag){
printf("不好意思,未找到!\n");
}
system("pause");
}
void del_people(){ //刪除單個聯系人信息
system("cls");
struct People *pt,*temp;
pt=head;
printf("請輸入要刪除的聯系人:");
char name[10];
scanf("%s",&name);
int flag=1;
while(pt!=NULL){
if(strcmp(name,pt->name)==0){
if(pt==head){
head = pt->next;
flag = 0;
printf("刪除成功!\n");
system("pause");

}else{
printf("刪除成功···\n");
system("pause");
temp->next=pt->next;
free(pt);
flag=0;
break;
}
}
temp=pt;
pt=pt->next;
}
if(flag){
printf("不好意思,未找到!\n");
system("pause");
}
}
void menu(){
system("cls");
printf(" ---------------------------------\n");
printf(" ----------通訊錄管理系統----------\n");
printf(" ----------1、錄入信息 ---------\n");
printf(" ----------2、查看全部信息---------\n");
printf(" ----------3、查看單個信息---------\n");
printf(" ----------4、刪除全部信息---------\n");
printf(" ----------5、刪除單個信息---------\n");
printf(" ----------6、修改單個信息---------\n");
printf(" ----------7、退出系統 ---------\n");
int choice;
printf("選擇任意一個功能:\n");
loop:
scanf("%d",&choice);
switch (choice){
case 1:
add_people();
menu();
case 2:
views_people();
menu();
case 3:
view_people();
menu();
break;
case 4:
delall_people();
menu();
case 5:
del_people();
menu();
case 6:
revise_people();
menu();
case 7:
exit(1);
break;
default:
printf("輸入錯誤!請重新輸入:");
goto loop;
}
}
int main(){
void add_people();
void views_people();
void delall_people();
void view_people();
void revise_people();
void del_people();
void menu();
menu();
return 0;
}
其中可能會有一些令人難以解讀的地方,還請評論區告訴我,對其加以修改。