c语言 链表 写通讯录

/*   实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址

提供方法:
1.	添加联系人信息
2.	删除指定联系人信息
3.	查找指定联系人信息
4.	修改指定联系人信息
5.	显示所有联系人信息
6.	清空所有联系人  */
#include<stdio.h>
#include"phone_book.h"
#include<string.h>
#include<assert.h>

typedef struct phone_book
{
	char name[10];
	char sex[5];
	char addr[20];
	int year;
	int phone_num;
	struct phone_book *pNext;
}Book,*pBook;

pBook add_linkman(pBook head)
{
	int i = 0;
	char name[10];
	char sex[5];
	char addr[20];
	int year;
	long phone_num;
	pBook pBase = head;

	assert(head);

flag:
	printf("你要添加多少个联系人:");
	scanf("%d",&i);
	if (i <= 0)
	{
		printf("输入数量错误!\n");
		goto flag;
	}
	if (head->pNext == NULL)
	{
		while (i--)
		{
			pBook pNew = (pBook)malloc(sizeof(Book));
			assert(pNew);
			printf("请输入联系人信息:(姓名、性别、地址、年龄、电话号码)\n");
			scanf("%s", name);
			scanf("%s", sex);
			scanf("%s", addr);
			strcpy(pNew->name, name);
			strcpy(pNew->sex, sex);
			strcpy(pNew->addr, addr);
			scanf("%d", &pNew->year);
			scanf("%d", &pNew->phone_num);
			pBase->pNext = pNew;
			pNew->pNext = NULL;
			pBase = pNew;
		}
	}
	else
	{
		while (pBase->pNext != NULL)
		{
			pBase = pBase->pNext;
		}
		while (i--)
		{
			pBook pNew = (pBook)malloc(sizeof(Book));
			assert(pNew);
			printf("请输入联系人信息:(姓名、性别、地址、年龄、电话号码)\n");
			scanf("%s", name);
			scanf("%s", sex);
			scanf("%s", addr);
			strcpy(pNew->name, name);
			strcpy(pNew->sex, sex);
			strcpy(pNew->addr, addr);
			scanf("%d", &pNew->year);
			scanf("%d", &pNew->phone_num);
			pBase->pNext = pNew;
			pNew->pNext = NULL;
		}

	}
	return head;
}

pBook remove_linkman(pBook head)
{
	pBook link_man = head;
	char name[10];
	if (!head)
	{
		printf("没有联系人,不能删除!\n");
		return NULL;
	}
	printf("请问你要删除哪位联系人?  ");
	scanf("%s",name);
	while (link_man->pNext!=NULL)
	{
		if (strcmp(link_man->pNext->name, name) == 0)
		{

			if (link_man->pNext->pNext == NULL)
			{
				free(link_man->pNext);
				link_man->pNext = NULL;
				printf("删除完成!\n");

			}
			else
			{
				pBook ptmp = NULL;
				ptmp = link_man->pNext;
				link_man->pNext = link_man->pNext->pNext;
				free(ptmp);
				printf("删除完成!\n");

			}
			return head;
		}
		else
		{
			link_man = link_man->pNext;
		}
	}
	printf("没有找到该联系人!\n");
	return head;
}

void traver_linkman(pBook head)
{
	pBook link_man = head;
	if (head->pNext == NULL)
	{
		printf("电话簿为空!\n");
	}
	while (link_man->pNext!=NULL)
	{
		printf("%s\n", link_man->pNext->name);
		printf("%s\n", link_man->pNext->sex);
		printf("%s\n", link_man->pNext->addr);
		printf("%d\n", link_man->pNext->year);
		printf("%ld\n", link_man->pNext->phone_num);
		printf("***********************************\n");
		link_man = link_man->pNext;
	}
}

void empty_linkman(pBook head)
{
	pBook ptmp = NULL;
	pBook link_man = head;
	if (head->pNext == NULL)
	{
		printf("电话簿为空!不用清空哦!(ˇ0ˇ) \n");
	}
	while (link_man->pNext != NULL)
	{
		if (link_man->pNext->pNext == NULL)
		{
			free(link_man->pNext);
			link_man->pNext = NULL;
		}
		else
		{
			ptmp = link_man->pNext;
			link_man->pNext = link_man->pNext->pNext;
			free(ptmp);

		}
	}
	printf("清空完成!\n");
}

pBook amend_linkman(pBook head)
{ 
	char name[10];
	char sex[5];
	char addr[20];
	pBook link_man = head;

	if (!head)
	{
		printf("没有联系人,不能修改!\n");
		return NULL;
	}
	printf("请问你要修改哪位联系人?  ");
	scanf("%s", name);
	while (link_man->pNext != NULL)
	{
		if (strcmp(link_man->pNext->name, name) == 0)
		{
			printf("请输入联系人信息:(姓名、性别、地址、年龄、电话号码)\n");
			scanf("%s", name);
			scanf("%s", sex);
			scanf("%s", addr);
			strcpy(link_man->pNext->name, name);
			strcpy(link_man->pNext->sex, sex);
			strcpy(link_man->pNext->addr, addr);
			scanf("%d", &link_man->pNext->year);
			scanf("%d", &link_man->pNext->phone_num);
			return head;
		}
		else
			link_man = link_man->pNext;

	}
	return head;
}

void search_linkman(pBook head)
{
	char name[10];
	pBook link_man = head;

	if (!head)
	{
		printf("没有联系人,查找失败!\n");
		return NULL;
	}
	printf("请问你要查找哪位联系人?  ");
	scanf("%s", name);
	while (link_man->pNext != NULL)
	{
		if (strcmp(link_man->pNext->name, name) == 0)
		{
			printf("%s\n", link_man->pNext->name);
			printf("%s\n", link_man->pNext->sex);
			printf("%s\n", link_man->pNext->addr);
			printf("%d\n", link_man->pNext->year);
			printf("%ld\n", link_man->pNext->phone_num);
			printf("***********************************\n");
			return 0;
		}
		else
			link_man = link_man->pNext;

	}
	printf("没有找到!\n");
}
void start(pBook *phead)
{
	int i = -1;
	assert(phead);
	while (1)
	{
		printf("欢迎使用电话薄系统!选择您的操作:\n\n");
		printf("*********************************************\n"
			   "*1.添加联系人信息     2.删除指定联系人信息  *\n"
			   "*3.查找指定联系人信息 4.修改指定联系人信息  *\n"
			   "*5.显示所有联系人信息 6.清空所有联系人      *\n"
			   "*0.结束系统! ————中情局专用————    *\n"
               "*********************************************\n");
		scanf("%d",&i);
		switch (i)
		{
		case 0:
			printf("*****感谢使用本系统!*****\n");
			exit(0);
		case 1:
			*phead=add_linkman( phead);
			break;
		case 2:
			*phead = remove_linkman(phead);
			break;
		case 3:
			 search_linkman(phead);
			break;
		case 4:
			*phead = amend_linkman(phead);
			break;
		case 5:
			traver_linkman(phead);
			break;
		case 6:
			empty_linkman( phead);
			break;
		default:
			printf("选择有误!请重新选择\n");
			break;
		}
	}
}
#include<stdio.h>
#include"phone_book.h"

int main()
{
	 pBook phead = NULL;
	start(&phead);
	return 0;
}
时间: 2024-10-05 03:11:38

c语言 链表 写通讯录的相关文章

关于c语言链表的操作

这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能..但是最近要考试了,所以没有写成菜单的形式..等考试完了,在进行补充吧.. 代码如下... #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int data; struct node *next; }; int main() { /*建立链表操作*/ int n,x,p

用链表写的学生管理系统 成绩的录入与查询都已经是实现了

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct teacher { char name[32]; int math; int english; int data; struct Node *next; }SLIST; int Creat_SList(); int SList_Print(); int SLis

C语言-链表

单向链表:结构体非常适合链表结构,链表的组成:head指针.数据块节点指针p->nest.结束指针NULL. 链表操作:需要首先找到表头head指针.链表的操作包括动态链表的创建.顺序输出.删除节点.插入节点的操作. 动态存储操作函数:(ANSI规则返回的指针类型为void*,早期的为字符型指针) 分配一个块:void *malloc(unsigned int size)  //分配成功则返回指向起始地址的指针void * 分配多个块:void *calloc(unsigned n,unsign

C语言代写,C语言作业代写,代写C语言,C语言编程代写

C语言代写,C语言作业代写,代写C语言,C语言编程代写 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.或领域类知识如金融数

代写C语言,C语言代写,C语言作业代写,C语言编程代写

代写C语言,C语言代写,C语言作业代写,C语言编程代写 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.或领域类知识如金融数

易语言怎样写双线程?一个线程循环找图。一个线程循环按键F2。

易语言怎样写双线程? 一个线程循环找图.一个线程循环按键F2. // .程序集变量 参数, 整数型 .程序集变量 线程句柄1, 整数型 .程序集变量 线程句柄2, 整数型 启动线程 (&子程序1, 参数,线程句柄1) 启动线程 (&子程序2, ,线程句柄2) // .子程序 子程序1 .参数 参数1, 整数型 信息框 (参数1, 0, ) 信息框 (“这是线程1的例子”, 0, ) // .子程序 子程序2 信息框 (“这是线程2的例子”, 0, ) // // 注意: 凡调用到COM接口

C语言怎么写头文件?

C语言中.h和.c文件解析(很精彩)   简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息.(生成.exe文件)

用链表写的冒泡排序理解

这是一位师弟问的问题,一段用链表写的冒泡排序. [1] 为什么要多用一个空的表头? 这是由链表结构造成的,如果要交换p1和p2两个节点,则需要p1的前趋的指针,举例,设原链表为{3,2,1}如果我们要交换3和2,由于3是表头节点,所以需要一个指向3的指针节点,因此这里我们设置了一个空的头节点p1,第一个元素的位置实际上在head->next上. [2] 释放指针方式解读 delete p; p=NULL; 最后要释放掉这个空的头节点,先保存下这个地址p1=head,实际表的地址指回原来的位置(h

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 name,性别 sex 和成绩 score 等.另一个域为指针域,存放下一结点的首地址.链表中的每一个结点都是同一种结构类型. 指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域. 在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域