⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7-4.cpp

📁 C语言编写的添加删除通讯录的小程序
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

typedef struct address            /* 通讯录信息结构 */
{  
char name[24];
  	char tele[24];
  	struct address *next;
} ADDR;

void displayMenu();
int choiceItem();
void freeRecord(ADDR *head);
ADDR *addRecord(ADDR *head);
ADDR *createRecord(ADDR *head);
ADDR *deleteRecord(ADDR *head);
void searchRecord(ADDR *head);
void saveFile(ADDR *head);
ADDR *readFile( );
void display(ADDR *head);

main( )
{
  ADDR *head = NULL; 		/* 表头指针 */
  int choice;

  clrscr( );
  do {
		choice = choiceItem( );			/* 菜单选择 */
        switch (choice)  {
		  	case 1: 	head = createRecord(head );			/* 创建通讯录 */
                        break;
			case 2:		head = addRecord(head); 			/* 添加记录 */
						break;
			case 3: 	head = deleteRecord(head);			/* 删除记录 */
						break;
			case 4: 	searchRecord(head);				/* 查找记录 */
						break;
			case 5: 	display(head);						/* 显示通讯录 */
						break;
			case 6: 	saveFile(head);					/* 保存到文件 */
						break;
			case 7: 	head = readFile( );					/* 从文件读通讯录数据 */
						break;
	  	}
	} while(choice!=0);
	printf( "\n\nBye!");
	freeRecord(head);
}

void displayMenu(void)   	/* 显示菜单 */
{
    printf("\n============= MENU =============\n");
    printf("\n 1 .........Create New Record\n ");
    printf("\n 2 .........Add Record \n");
    printf("\n 3..........Delete Record \n");
    printf("\n 4..........Search Record \n");
	printf("\n 5..........Display Record \n");
	printf("\n 6..........Save to File \n");
	printf("\n 7..........Read from File \n");
    printf("\n 0..........Exit System \n ");
    printf("\nChoice:");
}

int choiceItem(void)      	/* 菜单选择 */
{
	int choice;
	char line[80];

    do{
		displayMenu( );
		gets(line);
        choice = atoi(line);;
    } while(choice<0 || choice>7);
    return choice;
}

void freeRecord(ADDR *p)		/* 释放链表结点 */
{
	ADDR *q;
	while (p!=NULL) {
		q = p;
		p = p->next;
		free(q);				/* 依次释放各结点 */
	}
}

ADDR *addRecord(ADDR *p)		/* 输入一组记录,添加到链表中 */
{
	ADDR head, *q;

	head.next = p;
	p = &head;
	while (p->next!=NULL)			/* 将当前指针移动到链表尾端 */
		p = p->next;

	while(1) {
		char text[80];

		q = (ADDR *)malloc(sizeof(ADDR));
		if (q==NULL)
			return head.next;
		q->next = NULL;
		printf("\n\nPlease enter the name and telephone number: ");
		gets(text);							/* 读取一行文本 */
		if (text[0]=='\0') 	break;				/* 空行为结束标志 */
		sscanf(text, "%s%s", q->name, q->tele);	/* 分解名称和电话号码 */
		p->next = q;				/* 在链表尾端添加结点 */
		p = q;					/* 更新当前指针 */
	}
	return head.next;
}

ADDR *createRecord(ADDR *p)		/* 创建新通讯录 */
{
	freeRecord(p);					/* 释放原链表所占空间 */
	return addRecord(NULL);		/* 输入一组记录,创建链表 */
}

ADDR *deleteRecord(ADDR *p)   	/* 根据输入的姓名删除记录 */
{
	char name[32];
	ADDR *q, head;				/* 前驱结点 */

	printf("\nPlease input the Name for deletion: ");
	gets(name);					/* 输入姓名 */

	for (head.next=p, q=&head; p!=NULL; p=p->next) {
		if (strcmp(p->name, name)!=0) 	/* 不等于当前结点中的姓名 */    
			q = p;				/* 以当前结点作为前驱结点 */
		else {
			q->next = p->next;		/* 从链表中移出当前结点 */
			free(p); 				/* 释放当前结点 */
			printf("\nThe %s has been deleted.\n", name);
			return head.next;
		}
	}
	printf("\nNo record of %s\n", name); 
	return head.next;
}

void searchRecord(ADDR *p)      	/* 通过输入的姓名查询记录 */
{
	char name[32];

	printf("\nPlease input the name for Search: ");
	gets(name);					/* 输入姓名 */
	for (; p!=NULL; p=p->next) {
		if (strcmp(p->name, name)==0) {		/* 找到指定的记录 */
			printf("\nName\tTelephone\n%s\t%s\n", p->name, p->tele); 
			return;
		}
	}
	printf("\nNo record of %s\n", name); 
}

void saveFile(ADDR *p)         	/* 将记录信息写入文件 */
{
	FILE *fp;
	char fname[32];

	printf("\nPlease input the FileName: ");
	gets(fname);					/* 输入文件名 */
	if ((fp = fopen(fname, "wb"))==NULL) {	/* 打开文件 */
       printf("Cannot open this file!\n"); 
       return;
	}
 	printf("\nSave File...");
   	for (; p!=NULL; p=p->next)		/* 遍历链表 */
		fwrite(p, sizeof(ADDR), 1, fp);		/* 写一个记录到文件 */
	fclose(fp);
  	printf("OK\n");
}

ADDR *readFile(void)   				/* 从文件中读取记录信息 */
{
	ADDR *p, *q, head = { "","", NULL };
	FILE *fp;
	char fname[32];

    printf("\nPlease input the FileName: ");
	gets(fname);					            /* 输入文件名*/
	if ((fp=fopen(fname, "rb")) == NULL) {		/* 打开文件 */
       printf("Cannot open this file!\n"); 
       return NULL;
   	}
    printf("\nRead File...");
   
	q = &head;					/* 尾端结点指针 */
    while(!feof(fp)) {				/* 读结束? */
	   	p = (ADDR *)malloc(sizeof(ADDR));
		if (p==NULL)
			break;
	   	p->next = NULL;
	   	if (1!=fread(p, sizeof(ADDR), 1, fp))
 			break;				/* 读失败时 */
	   	q->next = p;				/* 在链表尾端添加 */
	   	q = p;					/* 更新尾端指针 */
    }
    fclose(fp);					/* 关闭文件 */
    printf("OK\n");
    return head.next;
}

void display(ADDR *p)      	/* 显示所有记录信息 */
{
printf("\nName\tTelephone\n");
	for (; p!=NULL; p=p->next)
		printf("%s\t%s\n", p->name, p->tele);
	printf("\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -