单链表实现的通讯录

这两天复习了一下单链表,将单链表的一些基本操作都自己写了一遍,也弥补了之前上课时不同的一些知识。

这次的通讯录我分了三个文件,对链表的基本操作都用函数封装起来了,这样的代码看起来更加清楚。

写选择操作功能的时候遇到了一个小问题,一开始我的选项是int类型的,但是只要我输入不是int类型的就会让程序崩掉,最后我将选项换成了char类型的,完美的解决了这个问题。虽然这个代码还是有点小bug,但还是能供大家参考的。

以下是通讯录的完整代码:

address.h

#ifndef AdDDRESS_H_HH
#define  AdDDRESS_H_HH

#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

struct Node 
{
	char name[15];
	char phone[20];
	char address[30];
	struct Node * next;
};

extern struct Node* createlist();
extern struct Node* createnode(struct Node info);
extern bool insertinfo(struct Node* list, struct Node info);
extern void printinfo(struct Node* list);
extern void menu();
extern char choose();
extern void work(struct Node* list);
extern bool insertoperation(struct Node* list);
extern bool deleteinfo(struct Node* list, char *name);
extern bool deleteoperation(struct Node* list);
extern struct Node searchinfo(struct Node* list, char *name);
extern bool searchoperation(struct Node* list);
extern void returnmenu();
extern void clearscreen();
#endif

addressfunc.cpp

#include "address.h"

//创建一个链表
struct Node* createlist()
{
	struct Node *list = new struct Node;
	list->next = NULL;
	return list;
}


//创建一个结点
struct Node* createnode(struct Node info)
{
	struct Node* newnode = new struct Node;
	newnode->next = NULL;
	strcpy(newnode->name, info.name);
	strcpy(newnode->phone, info.phone);
	strcpy(newnode->address, info.address);
	// cout << "创建结点调试" << endl;
	// cout << newnode->name << endl;
	return newnode;
}

//在尾部插入一个结点
bool insertinfo(struct Node* list, struct Node info)
{
	struct Node* newnode = createnode(info);
	
	if(newnode->name == NULL)
		return false;
	struct Node* temp = list;
	while (temp->next != NULL)
	{
		temp = temp->next;
	}
	newnode->next = NULL;
	temp->next = newnode;
	// cout << "插入结点调试" << endl;
	// cout << newnode->name << endl;
	return true;	
}

//删除联系人
bool deleteinfo(struct Node* list, char *name)
{
	struct Node* temp = list;
	struct Node* p = list->next;
	if(p == NULL)
	{
		cout << "没有叫 " << name << " 的联系人" << endl;
		return false;
	}
	while(strcmp(p->name, name) != 0)
	{
		if(p->next == NULL)
		{
			cout << "没有叫 " << name << " 的联系人" << endl;
			return false;
		}
		p = p->next;
		temp = temp->next;
	}
	temp->next = p->next;
	delete p;
	return true;
}

//查找联系人
struct Node searchinfo(struct Node* list, char* name)
{
	struct Node* temp = list;
	struct Node* p = list->next;
	struct Node a;
	if(p == NULL)
	{
		cout << "没有叫 " << name << " 的联系人" << endl;
		strcpy(a.name, "nonono");
		strcpy(a.phone, "nonono");
		strcpy(a.address, "nonono");
		return a;
	}
	while (strcmp(p->name, name))
	{
		if(p->next == NULL)
		{
			cout << "没有叫 " << name << " 的联系人" << endl;
			strcpy(a.name, "nonono");
			strcpy(a.phone, "nonono");
			strcpy(a.address, "nonono");
			return a;
		}
		temp = temp->next;
		p = p->next;
	}
	cout << "查找联系人调试" << endl;
	cout << p->name << endl;
	return *p;
}

//打印所有的信息
void printinfo(struct Node* list)
{
	struct Node* temp = list->next;
	// cout << "打印所有的信息调试" << endl;
	// cout << temp->name << endl;
	if(temp == NULL)
	{
		cout << "没有任何信息" << endl;
		return;
	}
	cout << "以下是所有的信息" << endl;
	while(temp != NULL)
	{
		cout << "名字:" << temp->name << endl
		     << "电话:" << temp->phone << endl
			 << "地址:" << temp->address <<endl << endl;
		temp = temp->next;
	}
}



//菜单栏
void menu()
{
	cout << "       -------------------------------------" << endl;
	cout << "       -             通讯录                -" << endl;
	cout << "       -         A、存入联系人             -" << endl;
	cout << "       -         B、删除联系人             -" << endl;
	cout << "       -         C、查找联系人             -" << endl;
	cout << "       -         D、打印所有信息           -" << endl;
	cout << "       -         E、退出通讯录             -" << endl;
	cout << "       -------------------------------------" << endl;
}

//选择
char choose()
{
	system("clear");
	menu();
	char a;
	cout << "请输入您的选择" << endl;
	cin >> a;
	//将小写字母转换成大写字母。
	if('a' == a)
		a = 'A';
	else if('b' == a)
		a = 'B';
	else if('c' == a)
		a = 'C';
	else if('d' == a)
		a = 'D';
	else if('e' == a)
		a = 'E';
	while(a < 'A' || a > 'E')
	{
		cout << "您是输入不正确,请重新输入" << endl;
		cin >> a;
		if('a' == a)
		a = 'A';
		else if('b' == a)
			a = 'B';
		else if('c' == a)
			a = 'C';
		else if('d' == a)
			a = 'D';
		else if('e' == a)
			a = 'E';
	}
	
	return a;
}

//插入信息的具体操作
bool insertoperation(struct Node* list)
{
	struct Node info;
	cout << "请输入信息" << endl;
	cout << "名字:";
	cin >> info.name;
	cout << "电话: ";
	cin >> info.phone;
	while(strlen(info.phone) != 11)
	{
		cout << "请输入11位手机号" << endl;
		cin >> info.phone;
	}
	cout << "地址:";
	cin >> info.address;
	bool insertok = insertinfo(list, info);
	return insertok;	
}

//删除信息的具体操作
bool deleteoperation(struct Node* list)
{
	cout << "请输入您要删除的联系人的名字" << endl;
	char name[15] = "0";
	cin >> name;
	bool deleteok = deleteinfo(list, name);
	return deleteok;
}

//查找联系人的具体操作
bool searchoperation(struct Node* list)
{
	cout << "请输入您要查找的联系人的名字" << endl;
	char name[15] = "0";
	cin >> name;
	struct Node searchresult = searchinfo(list, name);
	if(strcmp(searchresult.name, name) == 0)
	{
		cout << "名字:" << searchresult.name << endl
		     << "电话:" << searchresult.phone << endl
			 << "地址:" << searchresult.address <<endl << endl;
			 return true;
	}
	else
		return false;
	
}

//操作的流程
void work(struct Node* list)
{
	char a = choose();
	switch (a)
	{
		case 'A'://插入信息
		{
			clearscreen();
			int ret = insertoperation(list);
			if(ret == true)
				cout << "信息存入成功" << endl;
			else 
				cout << "信息存入失败" << endl;
			returnmenu();
		}break;
		case 'B'://删除信息
		{
			clearscreen();
			int ret = deleteoperation(list);
			if(ret == true)
				cout << "信息删除成功" << endl;
			else 
				cout << "信息删除失败" << endl;
			returnmenu();
		}break;
		case 'C'://查找联系人
		{
			clearscreen();
			int ret = searchoperation(list);
			if(ret == true)
				cout << "查找联系人成功" << endl;
			else 
				cout << "查找联系人失败" << endl;
			returnmenu();
		}break;
		case 'D': //打印所有的信息
		{
			clearscreen();
			printinfo(list);
			returnmenu();
		}
			break;
		case 'E':
			exit(1);
			break;
	}
	
}

//返回菜单栏
void returnmenu()
{
	cout << "输入q返回菜单栏" << endl;
	char a;
	cin >> a;
	while(a != 'q' && a != 'Q')
	{
		cout << "输入不正确" << endl;
		cin >> a;
	}
}

//清屏操作
void clearscreen()
{
	system("clear");
	cout << endl << endl << endl ;
}


addressmain.cpp

#include "address.h"

int main()
{
	struct Node* list = createlist();

	while(1)
	{
		work(list);
	}
	
	return 0;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值