1. 程式人生 > >設計實現一個簡易通訊錄,要求使用結構體

設計實現一個簡易通訊錄,要求使用結構體

實現一個通訊錄;

通訊錄可以用來儲存1000個人的資訊,每個人的資訊包括:

姓名、性別、年齡、電話、住址

提供方法:

1.新增聯絡人資訊

2.刪除指定聯絡人資訊

3.查詢指定聯絡人資訊

4.修改指定聯絡人資訊

5.顯示所有聯絡人資訊

6.清空所有聯絡人

7.以名字排序所有聯絡人

由於一般儲存都使用不了1000個人的資訊,故為了省空間我使用的是單鏈表儲存聯絡人的資訊,有一個儲存一個,單鏈表具有省空間的作用,我將函式程式碼封裝,下邊我將分佈列出來

定義結構體標頭檔案

#ifndef __telphone_H__

#define _CRT_SECURE_NO_WARNINGS 1

#define __telphone_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct tel_number
{
	char name[8];
	int sex;
	int age;
	char tel[12];
	char address[20];
	struct tel_number *next;
}Node, *Telphone;


#define TRUE 1
#define FALSE 0


extern void Init_tel(Telphone *S);  //聯絡人鏈表初始化
extern char *fun_sb(char name[]);  //輸入指定聯絡人
extern int Add_tel(Telphone S);    //增加聯絡人
extern void Show_tel(Telphone S);  //顯示所有聯絡人
extern int Delete_tel(Telphone S, char name[]);  //刪除制定聯絡人
extern int fund_tel(Telphone S, char name[]);   //尋找指定聯絡人
extern int Mod_tel(Telphone S, char name[]);  //修改指定聯絡人
extern void Empty_tel(Telphone S);    //清空聯絡人
extern int  Sort_tel(Telphone S);  //按姓名排序
extern void menu();   //選單

#endif

主函式檔案

#include"telphone.h"

int main()
{
	int let = 0;
	Telphone S;
	Init_tel(&S);
	char name[10];
	int n = 1;
	while (n)
	{
		system("cls");
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			let = Add_tel(S);
			if (let == 1)
				printf("輸入成功!\n");
			else printf("輸入失敗!\n");
			system("pause");
			break;
		case 2:
			let = Delete_tel(S, fun_sb(name));
			if (let == 1)
				printf("成功刪除該指定聯絡人!\n");
			else printf("刪除失敗!\n");
			system("pause");
			break;
		case 3:
			let = fund_tel(S, fun_sb(name));
			if (let == 0)
				printf("未找到該指定聯絡人");
			system("pause");
			break;
		case 4:
			let = Mod_tel(S, fun_sb(name));
			if (let == 1)
				printf("成功修改該指定聯絡人!\n");
			else printf("修改失敗!\n");
			system("pause");
			break;
		case 5:
			Show_tel(S);
			printf("已全部顯示!\n");
			system("pause");
			break;
		case 6:
			Empty_tel(S);
			printf("\t清除成功!\n");
			system("pause");
			break;
		case 7:
			let=Sort_tel(S);
			if (let == 1)
				printf("成功將聯絡人按姓名排序!\n");
			else printf("排序失敗!\n");
			system("pause");
			break;
		case 8:
			printf("\n\t\t\t\t謝謝使用!\n");
			n = 0;
			break;
		default:
			printf("\a\t\t輸入序號有誤!請重新輸入!!!\n");
			system("pause");
			break;
		}
	}
	system("pause");
	return 0;
}

聯絡人鏈表初始化

#include"telphone.h"

//電話簿初始化
void Init_tel(Telphone *S)
{
	*S = (Telphone)malloc(sizeof(Node));
	(*S)->next = NULL;
}

輸入指定聯絡人

#include"telphone.h"

//輸入聯絡人
char *fun_sb(char name[])
{
	getchar();
	printf("請輸入指定聯絡人:");
	gets(name);
	return name;
}

增加聯絡人

int Add_tel(Telphone S)//鏈棧進棧
{
	Node *temp;
	temp = (Node *)malloc(sizeof(Node));
	if (temp == NULL)
		return(FALSE);   /* 申請空間失敗 */
	char name[10];
	char address[20];
	char c = 1;
	int  i = 0, j = 0;
	getchar();
	printf("請輸入姓名:");
	gets(name);
	printf("請輸入性別:男->1,女->0  :");
	scanf("%d", &(temp->sex));
	strcpy(temp->name, name);
	printf("請輸入年齡:");
	scanf("%d", &(temp->age));
	getchar();
	printf("請輸入住址:");
	gets(address);
	printf("請輸入電話號碼:");
	gets(temp->tel);
	strcpy(temp->address, address);
	temp->next = S->next;
	S->next = temp;   /* 修改當前棧頂指標 */
	return(TRUE);
}

顯示所有聯絡人

#include"telphone.h"

void Show_tel(Telphone S)  //顯示所有聯絡人
{
	int i = 0;
	Node * temp = S->next;
	if (temp == NULL)
		return;
	printf("姓名:%s\n", temp->name);
	printf("性別:");
	if (1 == (temp->sex))
		printf("男\n");
	else printf("女\n");
	printf("年齡:%d\n", temp->age);
	printf("電話號碼:%s\n", temp->tel);
	printf("住址:%s\n\n", temp->address);
	Show_tel(S->next);
}

刪除指定聯絡人

#include"telphone.h"

//刪除指定聯絡人
int Delete_tel(Telphone S, char name[])
{
	Node * temp;
	if (S->next == NULL)
		return FALSE;
	else
	{
		temp = S->next;
		if (strcmp(temp->name, name) == 0)
		{
			S->next = temp->next;
			return TRUE;
		}
		else Delete_tel(S->next, name);
	}
	return FALSE;
}

尋找指定聯絡人

#include"telphone.h"

//尋找指定聯絡人
int fund_tel(Telphone S, char name[])
{
	int i = 0;
	Node* temp;
	if (S->next == NULL)
		return FALSE;
	else
	{
		temp = S->next;
		if (strcmp(temp->name, name) == 0)
		{
			printf("找到指定聯絡人! 資訊如下:\n");
			printf("姓名:%s\n", temp->name);
			printf("性別:");
			if (1 == (temp->sex))
				printf("男\n");
			else printf("女\n");
			printf("年齡:%d\n", temp->age);
			printf("電話號碼:%s\n", temp->tel);
			printf("住址:%s\n", temp->address);
			return TRUE;
		}
		else fund_tel(S->next, name);
	}
	return FALSE;
}

修改指定聯絡人

#include"telphone.h"

//修改制定聯絡人
int Mod_tel(Telphone S, char name[])
{
	int i = 0;
	Node *temp;
	if (S->next == NULL)
		return FALSE;
	else
	{
		temp = S->next;
		if (strcmp(temp->name, name) == 0)
		{
			printf("找到指定聯絡人!請修改!\n :");
			printf("姓名由%s修改為:", temp->name);
			gets(name);
			printf("請輸入性別:男->1,女->0  :");
			scanf("%d", &(temp->sex));
			strcpy(temp->name, name);
			printf("年齡由%d修改為:", temp->age);
			scanf("%d", &(temp->age));
			getchar();
			printf("住址由%s修改為:", temp->address);
			gets(temp->address);
			printf("電話號碼由%s修改為:", temp->tel);
			gets(temp->tel);
			return TRUE;
		}
		else Mod_tel(S->next, name);
	}
	return ;
}

清空聯絡人

#include"telphone.h"

//清空
void Empty_tel(Telphone S)
{
	if (S->next != NULL)
		free(S);
	S->next = NULL;
}

按姓名排序

#include"telphone.h"

//按姓名排序
int  Sort_tel(Telphone S)
{
	if (S->next = NULL)
		return FALSE;
	int flag = 0;
	Node *p3 = S;
	Node *p2, *p1, *p4, *p5;
	while (p3->next->next != NULL)//注意連結串列向前推進的方式
	{
		p2 = p3->next;
		p5 = p2;
		p1 = p2;
		p4 = p1;
		while (p1->next != NULL)//記憶體迴圈終止的條件
		{
			if (strcmp(p5->name, p1->next->name)>0)//找出原連結串列中剩餘節點中值最小的那個節點
			{
				p5 = p1->next;
				p4 = p1;
				flag = TRUE;
			}
			p1 = p1->next;
		}
		if (flag)//交換兩個節點的順序,值小的節點往前調
		{
			if (p2 == p4)//此種情況為要交換順序的兩個節點相鄰
			{
				p2->next = p5->next;
				p5->next = p2;
				p3->next = p5;
			}
			else//這種情況為要交換的兩個節點不相鄰
			{
				Node *temp = p5->next;
				p5->next = p2->next;
				p3->next = p5;
				p4->next = p2;
				p2->next = temp;
			}
		}
		p3 = p3->next;
	}
	return TRUE;
}

注:本人使用的是VS2013編譯器,為了使用scanf,故定義了巨集 #define _CRT_SECURE_NO_WARNINGS 1  如果在別的編譯器執行,則不需要定義這個巨集,

執行結果:

結果就不予展示了,有興趣的可以複製程式碼然後執行,

本人也是初學,程式碼中難免有許多疏漏之處,歡迎各位大神批評指正!