#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Person
{
int id;
char name[20];
char sex;
char tel[20];
}datatype;
//定义结点结构体类型
typedef struct Node
{
union
{
datatype data;
int len;
};
struct Node *prior;
struct Node *next;
} *DoubleLoop,Node;
DoubleLoop list_create();
void list_init(DoubleLoop L);
DoubleLoop apply_node(datatype e);
int list_insert_tail(DoubleLoop L,datatype e);
void list_show(DoubleLoop L);
int list_find_name(DoubleLoop L,char *name);
int list_find_data(DoubleLoop L,datatype data);
int list_update_contacts(DoubleLoop L,datatype e);
//按姓名进行删除
int list_delete_name(DoubleLoop L,char* name);
int list_insert_pos(DoubleLoop L,int pos,datatype e);
void list_sort_name(DoubleLoop L);
int getlength(DoubleLoop L);
void swap(datatype *a,datatype *b);
#endif
#include"stu.h"
DoubleLoop list_create()
{
DoubleLoop L=(DoubleLoop)malloc(sizeof(Node));
if(NULL==L)
{
printf("双向循环链表失败");
return NULL;
}
list_init(L);
printf("创建成功\n");
return L;
}
void list_init(DoubleLoop L)
{
L->len=0;
L->next=L;
L->prior=L;
printf("链表初始化成功\n");
}
DoubleLoop apply_node(datatype e)
{
DoubleLoop p=(DoubleLoop)malloc(sizeof(Node));
if(NULL==p)
{
printf("节点申请失败");
return NULL;
}
p->data=e;
p->next=NULL;
p->prior=NULL;
}
int list_insert_tail(DoubleLoop L,datatype e)
{
if(NULL==L)
{ printf("所给链表不合法");
return -1;
}
DoubleLoop p=apply_node(e);
//采用尾插法
DoubleLoop q=L->next;
while(q->next!=L)
{
q=q->next;
}
p->next=q->next;
p->prior=q;
q->next=p;
L->prior=p;
L->len++;
printf("%s双向循环链表尾插成功\n",e.name);
}
void list_show(DoubleLoop L)
{
if(NULL==L||L->next==L)
{
printf("遍历失败\n");
return;
}
DoubleLoop q=L->next;
printf("所有人员信息如下:\n");
printf("编号\t姓名\t性别\t电话\t\t\n");
while(q!=L)
{
printf("%d\t%s\t%c\t%s\t\t\n",q->data.id,q->data.name,q->data.sex,q->data.tel);
q=q->next;
}
printf("\n");
}
int list_find_name(DoubleLoop L,char* name)
{
if(NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
if(strlen(name)==0)
{
printf("所给名字不能为空\n");
return -2;
}
DoubleLoop q=L->next;
int flag=0;
while(q!=L)
{
if(strcmp(q->data.name,name)==0)
{
printf("%s的信息已找到,详细信息如下\n",name);
printf("编号\t姓名\t性别\t电话\t\t\n");
printf("%d\t%s\t%c\t%s\t\t\n",q->data.id,q->data.name,q->data.sex,q->data.tel);
flag=1;
return flag;
}
q=q->next;
}
if(flag==0)
{
printf("%s的信息未找到\n",name);
return flag;
}
}
int list_delete_name(DoubleLoop L,char* name)
{
if(NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
if(strlen(name)==0)
{
printf("所给名字不能为空\n");
return -2;
}
int result=list_find_name(L,name);
if(result<=0)
{
printf("名字为%s的联系人未找到,删除信息失败\n",name);
return -3;
}
DoubleLoop q=L->next;
while(q!=L)
{
if(strcmp(q->data.name,name)==0)
{
printf("%s的信息已找到,开始进行删除\n",name);
break;
}
q=q->next;
}
q->prior->next=q->next;
q->next->prior=q->prior;
free(q);
q=NULL;
L->len--;
printf("%s的信息删除成功",name);
}
int list_insert_pos(DoubleLoop L,int pos,datatype e)
{
if(NULL==L||pos<0||pos>L->len+1)
{
printf("所给链表不合法");
return -1;
}
DoubleLoop p=apply_node(e);
if(NULL==p)
{
return -2;
}
DoubleLoop q=L;
while(pos>0)
{
q=q->next;
pos--;
}
printf("插入结点前一个结点数据:%d\n",q->data.id);
p->next=q->next;
q->next=p;
p->prior=q;
q->prior=p;
L->len++;
printf("%d位置插入成功\n",pos);
}
int getlength(DoubleLoop L)
{
if(NULL==L)
{
printf("链表非法");
return -1;
}
return L->len;
}
void list_sort_name(DoubleLoop L)
{
if(NULL==L)
{
printf("链表非法");
return;
}
if(getlength(L)==1||getlength(L)==0)
{
printf("无需比较");
return;
}
printf("链表长度:%d\n",L->len);
for(int i=1;i<L->len;i++)
{
DoubleLoop q=L->next;
DoubleLoop q1=q->next;
for(int j=0;j<L->len-i;j++)
{
if(strcmp(q->data.name,q1->data.name)>0)
{
swap(&(q->data),&(q1->data));
}
q=q->next;
q1=q1->next;
}
}
}
void swap(datatype *a,datatype *b)
{
datatype temp;
temp=*a;
*a=*b;
*b=temp;
}
#include"stu.h"
int main(int argc, const char *argv[])
{
int menu1;
char username[20];
char pwd[20];
NEXT:
while(1)
{
printf("\t\t==========员工登录系统===========");
printf("\t\t1.注册信息\n");
printf("\t\t2.用户登录\n");
printf("\t\t0.退出\n");
printf("请输入功能选项");
scanf("%d",&menu1);
switch(menu1)
{
case 1:
{
for(;;)
{
printf("请输入注册账号:");
scanf("%s",username);
printf("请输入注册密码:");
scanf("%s",pwd);
if(strlen(pwd)<6)
{
printf("您输入的密码不合法");
}else
{
printf("注册成功\n");
break;
}
}
FILE *fp=fopen("./account.txt","a+");
if(NULL==fp)
{
printf("文件打开失败\n");
return -1;
}
fprintf(fp,"%s %s\n",username,pwd);
fclose(fp);
}
break;
case 2:
{
char loginname[20];
char passwd[20];
printf("请输入登录账号:");
scanf("%s",loginname);
printf("请输入登录密码");
scanf("%s",passwd);
FILE *fp=fopen("./account.txt","r");
if(NULL==fp)
{
printf("文件打开失败");
return -1;
}
while(!feof(fp))
{
fscanf(fp,"%s%s",username,pwd);
printf("username=%s\n",username);
printf("pwd=%s\n",pwd);
if(strcmp(username,loginname)==0&&strcmp(pwd,passwd)==0)
{
printf("登录成功\n");
DoubleLoop L=NULL;
while(1)
{
printf("二级菜单\n");
printf("\t\t1.创建模块\n");
printf("\t\t2.添加数据\n");
printf("\t\t3.查找信息\n");
printf("\t\t4.修改信息\n");
printf("\t\t5.删除信息\n");
printf("\t\t6.插入信息\n");
printf("\t\t7.展示信息\n");
printf("\t\t8.按照姓名将通讯录排序\n");
printf("请输入功能选项:");
scanf("%d",&menu1);
switch(menu1)
{
case 1:
{
L=list_create();
}
break;
case 2://添加数据
{
if(NULL==L)
{
printf("您还未创建链表,请先创建链表");
break;
}
printf("开始录入人员信息:\n");
char input[2];
do{
datatype e;
printf("请输入人员编号:");
scanf("%d",&e.id);
printf("请输入人员姓名:");
scanf("%s",e.name);
getchar();
printf("请输入人员性别,F:女 M:男");
scanf("%c",&e.sex);
printf("请输入人员电话");
scanf("%s",e.tel);
//调用尾插法插入人员数据
list_insert_tail(L,e);
printf("是否继续录入?Y/N:");
scanf("%s",input);
}while(strcmp(input,"N")!=0&&strcmp(input,"Y")==0);
}break;
case 3://查找信息
{
if(NULL==L)
{
printf("您还未创建链表,请先创建链表\n");
break;
}
printf("请输入要查找的姓名:\n");
char name[20];
scanf("%s",name);
list_find_name(L,name);
}
break;
case 4: //修改信息
{
if(NULL==L)
{
printf("您还未创建链表,请先创建链表\n");
break;
}
datatype e;
printf("请输入要修改人员的姓名:");
scanf("%s",e.name);
printf("请输入要修改的人员编号:");
scanf("%d",&e.id);
getchar();
printf("请输入要修改人员性别,");
scanf("%c",&e.sex);
printf("请输入要修改人员电话");
scanf("%s",e.tel);
}
break;
case 5://删除信息
{
if(NULL==L)
{
printf("您还未创建链表");
break;
}
//删除信息
printf("请输入要删除的姓名:\n");
char name[20];
scanf("%s",name);
printf("name=%s\n",name);
list_delete_name(L,name);
}
break;
case 6: //插入信息
{
if(NULL==L)
{
printf("您还未创建链表");
break;
}
//插入信息
datatype einsert;
int pos;
printf("请输入要插入的人员姓名:");
scanf("%s",einsert.name);
printf("请输入要插入的人员编号:");
scanf("%d",&einsert.id);
getchar();
printf("请输入要插入的人员性别,");
scanf("%c",&einsert.sex);
printf("请输入要插入的人员电话 :");
scanf("%s",einsert.tel);
printf("请输入要插入的位置:");
scanf("%d",&pos);
list_insert_pos(L,pos,einsert);
}
break;
case 7:
{
if(NULL==L)
{
printf("您还未创建链表\n");
break;
}
list_show(L);
}
break;
case 8:
{
if(NULL==L)
{
printf("请先创建链表");
break;
}
list_sort_name(L);
}
break;
}
}
}
}
}
}