今天做了个项目,第一次,问题可能比较多。
写的也比较不规范,以后经量该。
先是头文件
#ifndef __LinkList_H__
#define __LinkList_H__
#define FALSE -1
#define TRUE 0
typedef struct LinkData //结构体存数据
{
int id;
char name[15];
char phone_num[15];
char house[30];
char telephone[10];
}LinkData;
typedef struct _node //声明链表
{
LinkData data;
struct _node *next;
}NODE;
// 创建链表
NODE * Create_List();
// 插入元素:尾插
int Insert_Last(NODE* h,LinkData data);
// 求链表长度:通过函数返回值返回
int Get_Len(NODE* h);
// 清空所有结点
int Clean_List(NODE* h);
// 销毁链表
int Destroy(NODE* h);
//主菜单
void menu(NODE* h);
//命令一:添加通讯录
void add_address_list(NODE* h);
//命令二:排序显示(按照ID排序)
void Risplay_Id(NODE* h);
//显示通讯录
void Risplay(NODE* h);
//命令三:搜索好友
void Find_friend(NODE* h);
//搜索好友:按名字搜索(只能搜索第一个)
void Find_name(NODE* tmp,char *data,int x);
//命令四:删除好友
void Del_name_id(NODE* h);
// 删除元素:根据名字删除指定数据(只能删除第一个)
int Delete_name(NODE* h, char *data);
//查找,按名字输出
void Risplay_name(NODE* h, char *data);
// 删除元素:根据ID删除指定数据(只能删除第一个)
int Delete_id(NODE* h,int id);
//查找name的数据个数,并且返回
int Find_name1(NODE* h,char *data);
再是主程序
/*
2017年7月25日08:51:15
项目:制作一个同学通讯录
*/
#include<stdio.h>
#include"LinkList.h"
#include<stdlib.h>
#include<string.h>
int main()
{
system("clear"); //清屏
NODE * h = Create_List(); //创建一个通讯录(头结点)
if (h == NULL )
return FALSE;
menu(h); //调用菜单
return 0;
}
// 创建一个头结点线性链表
NODE * Create_List()
{
NODE *head = (NODE *)malloc(sizeof(NODE)/sizeof(char));
if (head == NULL)
{
printf("创建失败。\n");
return NULL;
}
head->next = NULL;
return head;
}
//菜单
void menu(NODE* h)
{
system("clear");
//定义主菜单
char *menu[] = {
" ------------------------------------------------\n",
" | |\n",
" | 通讯录 |\n",
" | |\n",
" | |\n",
" | A:添加好友 B:列表好友 |\n",
" | |\n",
" | |\n",
" | c:搜索好友 D:删除好友 |\n",
" | |\n",
" | (q退出软件) |\n",
" ------------------------------------------------\n"};
int i;
for (i=0;i<12;i++)
printf("%s",menu[i]);
char ch;
while(1)
{
scanf("%c",&ch);
while(getchar() != '\n');
if (ch!='a' && ch!='b' && ch!='c' && ch!='d' && ch!='q')
{
printf("input again!\n");
continue;
}
switch (ch)
{
case 'a':
add_address_list(h);
break ;
case 'b':
Risplay_Id(h);
break ;
case 'c':
Find_friend(h);
break ;
case 'd':
Del_name_id(h);
break ;
case 'q':
break ;
}
break;
}
}
//命令一:添加通讯录
void add_address_list(NODE* h)
{
if (h == NULL)
return ;
system("clear");
LinkData data;
printf("请输入好友ID:");
scanf("%d",&data.id);
printf("请输入好友姓名(英文):");
scanf("%s",data.name);
printf("请输入好友电话号码:");
scanf("%s",data.phone_num);
printf("请输入好友家庭住址:");
scanf("%s",data.house);
printf("请输入好友公共电话:");
scanf("%s",data.telephone);
if (Insert_Last(h,data)==TRUE)
printf("添加成功!\n");
else printf("添加失败!\n");
getchar();
printf("按任意键返回返回\n");
char ch;
scanf("%c",&ch);
menu(h);
}
// 插入元素:尾插
int Insert_Last(NODE* h,LinkData data)
{
if ( h == NULL )
return FALSE;
NODE *node = (NODE *)malloc(sizeof(NODE)/sizeof(char));
if (node == NULL)
return FALSE;
node->data = data;
node->next = NULL;
NODE *tmp = h;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next = node;
return TRUE;
}
//命令二:排序显示(按照ID排序)
void Risplay_Id(NODE* h)
{
if (h == NULL || h->next == NULL)
return ;
NODE *tmp;
int len = Get_Len(h);
int i,j;
for(i=0;i<len-1;i++)
{
tmp = h->next;
for(j=0;j<len-i-1;j++)
{
if(tmp->data.id > tmp->next->data.id)
{
LinkData tmp1;
tmp1 = tmp->next->data;
tmp->next->data = tmp->data;
tmp->data = tmp1;
}
tmp = tmp->next;
}
}
Risplay(h);
getchar();
printf("按任意键返回返回\n");
char ch;
scanf("%c",&ch);
menu(h);
}
//显示通讯录
void Risplay(NODE* h)
{
if (h == NULL)
return ;
system("clear");
while(h->next != NULL)
{
printf("好友ID:%d\n",h->next->data.id);
printf("好友姓名(英文):%s\n",h->next->data.name);
printf("好友电话号码:%s\n",h->next->data.phone_num);
printf("好友家庭住址:%s\n",h->next->data.house);
printf("好友公共电话:%s\n\n",h->next->data.telephone);
h = h->next;
}
printf("\n");
}
// 求链表长度:通过函数返回值返回
int Get_Len(NODE* h)
{
if(h == NULL )
return FALSE;
int count = 0;
NODE* tmp = h;
while(tmp->next)
{
count ++;
tmp = tmp->next;
}
return count;
}
//命令三:搜索好友
void Find_friend(NODE* h)
{
if (h == NULL )
return ;
system("clear");
if(h->next == NULL)
{
printf("没有好友,查找失败。\n");
return ;
}
char data[15];
printf("请输入你要查找的成员名字:");
scanf("%s",data);
int x = 1; //x表示搜索的次数
NODE* tmp = h->next;
Find_name(tmp,data,x);
getchar();
printf("按任意键返回返回\n");
char ch;
scanf("%c",&ch);
menu(h);
}
//搜索好友:按名字搜索(只能搜索第一个)
void Find_name(NODE* tmp,char *data,int x)
{
while(tmp)
{
if(strcmp(tmp->data.name,data) == 0 )
break;
tmp = tmp->next;
}
if (tmp == NULL && x == 1) //第一次查找,没有找到
{
printf("查找失败,没有该好友。\n");
return ;
}
if (tmp == NULL && x != 1) //非第一次查找
return ;
printf("好友ID:%d\n",tmp->data.id);
printf("好友姓名(英文):%s\n",tmp->data.name);
printf("好友电话号码:%s\n",tmp->data.phone_num);
printf("好友家庭住址:%s\n",tmp->data.house);
printf("好友公共电话:%s\n\n",tmp->data.telephone);
if (tmp != NULL )
Find_name(tmp->next,data,x+1);
}
//命令4:删除好友
void Del_name_id(NODE* h)
{
if (h == NULL)
return ;
system("clear");
Risplay(h); //先查看元素
char data[15];
printf("请输入你要删除的成员名字:");
scanf("%s",data);
int x = Find_name1(h,data); //x表示找到的个数
if( x == 1) //找到一个
{
if(Delete_name(h,data) == TRUE) //删除
printf("删除成功!\n");
else
{
printf("删除失败,没有该好友。\n");
}
}
else if( x>1) //找到两个以上
{
Risplay_name(h,data);
printf ("请在输入你要删除的成员ID:");
int id;
scanf("%d",&id);
if(Delete_id(h,id) == TRUE)
{
printf("删除成功\n");
}
else
{
printf("删除失败,没有该好友。\n");
}
}
getchar();
printf("按任意键返回返回\n");
char ch;
scanf("%c",&ch);
menu(h);
}
//查找name的数据个数,并且返回
int Find_name1(NODE* h,char *data)
{
if (h == NULL )
return ;
if(h->next == NULL)
{
printf("表为空,删除失败。\n");
return FALSE;
}
int count = 0;
NODE* tmp = h->next;
while(tmp)
{
if(strcmp(tmp->data.name,data) == 0 )
count ++;
tmp = tmp->next;
}
if (count == 0)
{
printf("删除失败,没有该好友。\n");
return FALSE;
}
return count ;
}
// 删除元素:根据名字删除指定数据(只能删除第一个)
int Delete_name(NODE* h, char *data)
{
if (h == NULL)
return FALSE;
NODE* tmp = h;
while(tmp->next)
{
if(strcmp(tmp->next->data.name,data) == 0)
break;
tmp = tmp->next;
}
if(tmp->next == NULL)
return FALSE;
NODE *p = tmp->next;
tmp->next = p->next;
free(p);
return TRUE;
}
//查找,按名字输出
void Risplay_name(NODE* h, char *data)
{
if (h == NULL )
return ;
system("clear");
NODE* tmp = h->next;
while(tmp)
{
if(strcmp(tmp->data.name,data) == 0 )
{
printf("好友ID:%d\n",tmp->data.id);
printf("好友姓名(英文):%s\n",tmp->data.name);
printf("好友电话号码:%s\n",tmp->data.phone_num);
printf("好友家庭住址:%s\n",tmp->data.house);
printf("好友公共电话:%s\n\n",tmp->data.telephone);
}
tmp = tmp->next;
}
}
// 删除元素:根据ID删除指定数据(只能删除第一个)
int Delete_id(NODE* h,int id)
{
if (h == NULL)
return FALSE;
NODE* tmp = h;
while(tmp->next)
{
if(id == tmp->next->data.id)
break;
tmp = tmp->next;
}
if(tmp->next == NULL)
return FALSE;
NODE *p = tmp->next;
tmp->next = p->next;
free(p);
return TRUE;
}