1月5日 学生信息管理系统

该代码实现了一个基于C语言的双向循环链表,包括链表的创建、初始化、节点插入、查找、删除、按位置插入、排序等功能。此外,还包含了一个简单的员工登录系统,支持用户注册和登录,登录后可以对链表中的人员信息进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;

}

}

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值