通信录作业,在链表中的结构体数组有点多此一举了
2016-11-17 19:08
204 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct user
{
char name[100];//姓名
char sex[2];//性别
char age[3];//年龄
char job[20];//工作
char tel_num[20];//电话
char emal_add[50];//邮箱地址
char address[100];//家庭住址
char postcode[10];//邮编
struct user *next;
};
typedef struct user Node;
typedef struct user *Link;//用户自定义
/*初始化结点并判断是否分配成功*/
void is_malloc_ok(Link *new_node)
{
if(new_node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_link(Link *new_node)
{
(*new_node) = (Link)malloc(sizeof(Node));//创建一个结点,返回其地址
is_malloc_ok(new_node);
}
void create_link_head(Link* head)
{
create_link(head);
(*head)->next = NULL;
}//建立头结点
/*头插函数*/
void insert_node_head(Link* head,Link new_node)
{
Link tmp = *head;
new_node->next = tmp->next;
tmp->next = new_node;
}
/*用户录入函数*/
void add_people(Link* head,int num)
{
int n;//用户定义输入数量
static int i = 0;//循环变量
static int j = 0;
static int temp = 0;
temp+=num;
Link new_node = NULL;//定义结点
create_link(&new_node);
Node users[30];//定义结构体数组
printf("请按以下要求输入:\n");
for (i ; i < temp; i++)
{
printf("姓名:");
scanf("%s",users[i].name);
printf("性别:");
scanf("%s",users[i].sex);
printf("年龄:");
scanf("%s",users[i].age);
printf("职位:");
scanf("%s",users[i].job);
printf("电话:");
scanf("%s",users[i].tel_num);
printf("邮箱地址:");
scanf("%s",users[i].emal_add);
printf("家庭住址:");
scanf("%s",users[i].address);
printf("邮编:");
scanf("%s",users[i].postcode);
printf("\n");
printf("******************\n");
users[i].next = NULL;
}
for (j ; j < temp ; j++)
{
create_link(&new_node);
strcpy(new_node->name,users[j].name);
strcpy(new_node->sex,users[j].sex);
strcpy(new_node->age,users[j].age);
strcpy(new_node->job,users[j].job);
strcpy(new_node->tel_num,users[j].tel_num);
strcpy(new_node->emal_add,users[j].emal_add);
strcpy(new_node->address,users[j].address);
strcpy(new_node->postcode,users[j].postcode);
new_node->next = users[j].next;
insert_node_head(head,new_node);//头插
}
menu(head);
}
/*用户查询函数*/
void find_people(Link* head,char find[])
{
printf("按姓名查找\n");
Link tmp;
Link p;
tmp = p = (*head)->next;
if ((*head)->next == NULL)
{
printf("目前无用户\n");
}
else
{
while(strcmp(tmp->name,find) != 0 && tmp->next != NULL)
{
p = tmp;
tmp = tmp->next;
}
if ( strcmp(tmp->name,find) == 0)
{
printf("姓名:%s\n",tmp->name);
printf("性别:%s\n",tmp->sex);
printf("年龄:%s\n",tmp->age);
printf("职位:%s\n",tmp->job);
printf("电话:%s\n",tmp->tel_num);
printf("邮箱地址:%s\n",tmp->emal_add);
printf("家庭住址:%s\n",tmp->address);
printf("邮编:%s\n",tmp->postcode);
}
else
{
printf("未找到该用户\n");
}
}
menu(head);
}
/*用户删除函数*/
void del_people(Link* head,char out[])
{
Link tmp;
Link p;
tmp = p = *head;
if ((*head)->next == (*head))
{
printf("目前无用户,不执行删除操作,返回菜单\n");
}
else
{
while(strcmp(tmp->name,out) != 0 && tmp->next != NULL)
{
p = tmp;
tmp = tmp->next;
}
if ( strcmp(tmp->name,out) == 0)
{
if(tmp == ((*head)->next))
{
(*head)->next = (*head)->next->next;
free(tmp);
}
else
{
p->next = tmp->next;
free(tmp);
}
}
else
{
printf("未找到所要删除的用户\n");
}
}
menu(head);
}
/*查看全部函数*/
void display_all_people(Link* head)
{
Link tmp = NULL;//防止野指针
tmp = (*head)->next;
if (tmp == NULL)
{
printf("无联系人i\n");
}
while ( tmp != NULL )
{
printf("姓名:%s\n",tmp->name);
printf("性别:%s\n",tmp->sex);
printf("年龄:%s\n",tmp->age);
printf("职位:%s\n",tmp->job);
printf("电话:%s\n",tmp->tel_num);
printf("邮箱地址:%s\n",tmp->emal_add);
printf("家庭住址:%s\n",tmp->address);
printf("邮编:%s\n",tmp->postcode);
tmp = tmp->next;
printf("****************************\n");
}
menu(head);
}
/*修改联系人函数*/
void change_people(Link* head,char change_name[])
{
printf("按姓名查找\n");
Link tmp;
Link p;
char name_change[100];
char sex_change[2];
char age_change[3];
char job_change[20];
char tel_num_change[20];
char emal_add_change[50];
char address_change[100];
char postcode_change[10];
int i;//用户决定修改项目
tmp = p = (*head)->next;
if ((*head)->next == NULL)
{
printf("目前无用户\n");
}
else
{
while(strcmp(tmp->name,change_name) != 0 && tmp->next != NULL)
{
p = tmp;
tmp = tmp->next;
}
if ( strcmp(tmp->name,change_name) == 0)
{
printf("请选择修改项:\n");
printf("1,姓名 2,性别 3,年龄 4,工作 5电话 6,邮箱地址 7,家庭住址 8,邮编\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("请输入要修改的姓名:\n");
scanf("%s",name_change);
strcpy(tmp->name,name_change);
break;
case 2:
printf("请输入要修改的性别:\n");
scanf("%s",sex_change);
strcpy(tmp->sex,sex_change);
break;
case 3:
printf("请输入要修改的年龄:\n");
scanf("%s",age_change);
strcpy(tmp->age,age_change);
break;
case 4:
printf("请输入要修改的工作:\n");
scanf("%s",job_change);
strcpy(tmp->job,job_change);
break;
case 5:
printf("请输入要修改的电话:\n");
scanf("%s",tel_num_change);
strcpy(tmp->tel_num,tel_num_change);
break;
case 6:
printf("请输入要修改的邮箱地址:\n");
scanf("%s",emal_add_change);
strcpy(tmp->emal_add,emal_add_change);
break;
case 7:
printf("请输入要修改的家庭住址:\n");
scanf("%s",address_change);
strcpy(tmp->address,address_change);
break;
case 8:
printf("请输入要修改的邮编:\n");
scanf("%s",postcode_change);
strcpy(tmp->postcode,postcode_change);
break;
}
}
else
{
printf("未找到该用户\n");
}
}
menu(head);
}
/*菜单显示函数*/
int menu(Link* head)
{
printf("/***************欢迎使用通信录****************/\n");
printf("/* 1.添加联系人 */\n");
printf("/* 2.查询联系人 */\n");
printf("/* 3.删除联系人 */\n");
printf("/* 4.查看全部联系人 */\n");
printf("/* 5.修改联系人 */\n");
printf("/* 6.退出 */\n");
printf("/*********************************************/\n");
int num;
int in;
char find[100];//目标联系人
char change_name[100];//所要修改的名字
char out[100];//所要找出的名字
printf("请输入你所需要的操作:\n");
scanf("%d",&num);
switch(num)
{
case 1:
printf("请输入要录入的用户数量\n");
scanf("%d",&in);
add_people(head,in);
break;
case 2:
printf("请输入目标联系人\n");
scanf("%s",find);
find_people(head,find);
break;
case 3:
printf("请输入要删除哪位联系人(输入姓名):\n");
scanf("%s",out);
del_people(head,out);
break;
case 4:
display_all_people(head);
break;
case 5:
printf("请输入需要更改的姓名");
scanf("%s",change_name);
change_people(head,change_name);
case 6: return;
default:
menu(head);
break;
}
return 0;
}
int main()
{
Link head = NULL;//定义头指针,防止野指针
create_link_head(&head);
menu(&head);
}
#include <stdlib.h>
#include <string.h>
struct user
{
char name[100];//姓名
char sex[2];//性别
char age[3];//年龄
char job[20];//工作
char tel_num[20];//电话
char emal_add[50];//邮箱地址
char address[100];//家庭住址
char postcode[10];//邮编
struct user *next;
};
typedef struct user Node;
typedef struct user *Link;//用户自定义
/*初始化结点并判断是否分配成功*/
void is_malloc_ok(Link *new_node)
{
if(new_node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_link(Link *new_node)
{
(*new_node) = (Link)malloc(sizeof(Node));//创建一个结点,返回其地址
is_malloc_ok(new_node);
}
void create_link_head(Link* head)
{
create_link(head);
(*head)->next = NULL;
}//建立头结点
/*头插函数*/
void insert_node_head(Link* head,Link new_node)
{
Link tmp = *head;
new_node->next = tmp->next;
tmp->next = new_node;
}
/*用户录入函数*/
void add_people(Link* head,int num)
{
int n;//用户定义输入数量
static int i = 0;//循环变量
static int j = 0;
static int temp = 0;
temp+=num;
Link new_node = NULL;//定义结点
create_link(&new_node);
Node users[30];//定义结构体数组
printf("请按以下要求输入:\n");
for (i ; i < temp; i++)
{
printf("姓名:");
scanf("%s",users[i].name);
printf("性别:");
scanf("%s",users[i].sex);
printf("年龄:");
scanf("%s",users[i].age);
printf("职位:");
scanf("%s",users[i].job);
printf("电话:");
scanf("%s",users[i].tel_num);
printf("邮箱地址:");
scanf("%s",users[i].emal_add);
printf("家庭住址:");
scanf("%s",users[i].address);
printf("邮编:");
scanf("%s",users[i].postcode);
printf("\n");
printf("******************\n");
users[i].next = NULL;
}
for (j ; j < temp ; j++)
{
create_link(&new_node);
strcpy(new_node->name,users[j].name);
strcpy(new_node->sex,users[j].sex);
strcpy(new_node->age,users[j].age);
strcpy(new_node->job,users[j].job);
strcpy(new_node->tel_num,users[j].tel_num);
strcpy(new_node->emal_add,users[j].emal_add);
strcpy(new_node->address,users[j].address);
strcpy(new_node->postcode,users[j].postcode);
new_node->next = users[j].next;
insert_node_head(head,new_node);//头插
}
menu(head);
}
/*用户查询函数*/
void find_people(Link* head,char find[])
{
printf("按姓名查找\n");
Link tmp;
Link p;
tmp = p = (*head)->next;
if ((*head)->next == NULL)
{
printf("目前无用户\n");
}
else
{
while(strcmp(tmp->name,find) != 0 && tmp->next != NULL)
{
p = tmp;
tmp = tmp->next;
}
if ( strcmp(tmp->name,find) == 0)
{
printf("姓名:%s\n",tmp->name);
printf("性别:%s\n",tmp->sex);
printf("年龄:%s\n",tmp->age);
printf("职位:%s\n",tmp->job);
printf("电话:%s\n",tmp->tel_num);
printf("邮箱地址:%s\n",tmp->emal_add);
printf("家庭住址:%s\n",tmp->address);
printf("邮编:%s\n",tmp->postcode);
}
else
{
printf("未找到该用户\n");
}
}
menu(head);
}
/*用户删除函数*/
void del_people(Link* head,char out[])
{
Link tmp;
Link p;
tmp = p = *head;
if ((*head)->next == (*head))
{
printf("目前无用户,不执行删除操作,返回菜单\n");
}
else
{
while(strcmp(tmp->name,out) != 0 && tmp->next != NULL)
{
p = tmp;
tmp = tmp->next;
}
if ( strcmp(tmp->name,out) == 0)
{
if(tmp == ((*head)->next))
{
(*head)->next = (*head)->next->next;
free(tmp);
}
else
{
p->next = tmp->next;
free(tmp);
}
}
else
{
printf("未找到所要删除的用户\n");
}
}
menu(head);
}
/*查看全部函数*/
void display_all_people(Link* head)
{
Link tmp = NULL;//防止野指针
tmp = (*head)->next;
if (tmp == NULL)
{
printf("无联系人i\n");
}
while ( tmp != NULL )
{
printf("姓名:%s\n",tmp->name);
printf("性别:%s\n",tmp->sex);
printf("年龄:%s\n",tmp->age);
printf("职位:%s\n",tmp->job);
printf("电话:%s\n",tmp->tel_num);
printf("邮箱地址:%s\n",tmp->emal_add);
printf("家庭住址:%s\n",tmp->address);
printf("邮编:%s\n",tmp->postcode);
tmp = tmp->next;
printf("****************************\n");
}
menu(head);
}
/*修改联系人函数*/
void change_people(Link* head,char change_name[])
{
printf("按姓名查找\n");
Link tmp;
Link p;
char name_change[100];
char sex_change[2];
char age_change[3];
char job_change[20];
char tel_num_change[20];
char emal_add_change[50];
char address_change[100];
char postcode_change[10];
int i;//用户决定修改项目
tmp = p = (*head)->next;
if ((*head)->next == NULL)
{
printf("目前无用户\n");
}
else
{
while(strcmp(tmp->name,change_name) != 0 && tmp->next != NULL)
{
p = tmp;
tmp = tmp->next;
}
if ( strcmp(tmp->name,change_name) == 0)
{
printf("请选择修改项:\n");
printf("1,姓名 2,性别 3,年龄 4,工作 5电话 6,邮箱地址 7,家庭住址 8,邮编\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("请输入要修改的姓名:\n");
scanf("%s",name_change);
strcpy(tmp->name,name_change);
break;
case 2:
printf("请输入要修改的性别:\n");
scanf("%s",sex_change);
strcpy(tmp->sex,sex_change);
break;
case 3:
printf("请输入要修改的年龄:\n");
scanf("%s",age_change);
strcpy(tmp->age,age_change);
break;
case 4:
printf("请输入要修改的工作:\n");
scanf("%s",job_change);
strcpy(tmp->job,job_change);
break;
case 5:
printf("请输入要修改的电话:\n");
scanf("%s",tel_num_change);
strcpy(tmp->tel_num,tel_num_change);
break;
case 6:
printf("请输入要修改的邮箱地址:\n");
scanf("%s",emal_add_change);
strcpy(tmp->emal_add,emal_add_change);
break;
case 7:
printf("请输入要修改的家庭住址:\n");
scanf("%s",address_change);
strcpy(tmp->address,address_change);
break;
case 8:
printf("请输入要修改的邮编:\n");
scanf("%s",postcode_change);
strcpy(tmp->postcode,postcode_change);
break;
}
}
else
{
printf("未找到该用户\n");
}
}
menu(head);
}
/*菜单显示函数*/
int menu(Link* head)
{
printf("/***************欢迎使用通信录****************/\n");
printf("/* 1.添加联系人 */\n");
printf("/* 2.查询联系人 */\n");
printf("/* 3.删除联系人 */\n");
printf("/* 4.查看全部联系人 */\n");
printf("/* 5.修改联系人 */\n");
printf("/* 6.退出 */\n");
printf("/*********************************************/\n");
int num;
int in;
char find[100];//目标联系人
char change_name[100];//所要修改的名字
char out[100];//所要找出的名字
printf("请输入你所需要的操作:\n");
scanf("%d",&num);
switch(num)
{
case 1:
printf("请输入要录入的用户数量\n");
scanf("%d",&in);
add_people(head,in);
break;
case 2:
printf("请输入目标联系人\n");
scanf("%s",find);
find_people(head,find);
break;
case 3:
printf("请输入要删除哪位联系人(输入姓名):\n");
scanf("%s",out);
del_people(head,out);
break;
case 4:
display_all_people(head);
break;
case 5:
printf("请输入需要更改的姓名");
scanf("%s",change_name);
change_people(head,change_name);
case 6: return;
default:
menu(head);
break;
}
return 0;
}
int main()
{
Link head = NULL;//定义头指针,防止野指针
create_link_head(&head);
menu(&head);
}
相关文章推荐
- 基于结构体数组的链表实现
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表
- 基于结构体数组的链表实现
- 结构体实现可变数组 链表
- C++大作业之链表实现的高精度加法,减法,和数组实现的高精度乘法。
- 作业《IOS_C语言》结构体、结构体数组
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
- 1.3.1线性链表之静态(结构体数组)链表
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
- 数组和链表的区别以及数组和结构体的区别
- HDU 1520 Anniversary party(树形DP 数组和结构体链表两种实现方式)
- 结构体与链表练习 删除数组中的元素
- c++笔记(5):操作符、结构体、结构数组、链表、约瑟夫问题
- 深入理解静态链表(,物理上是一个结构体数组,逻辑上是两个链表,)执行一下,,,
- 指针数组 指针的指针 二维数组指针 结构体指针 链表
- *指针_函数指针、指针控制数组、链表(结构体指针)
- 数组、链表、结构体的适用情况
- 《IOS_作业C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)