员工信息系统数据结构c语言版,数据结构C语言_员工信息

/*根据实验内容编程,上机调试、得出正确的运行程序。系统能够完成员工信息的查询、

更新、插入、删除、排序功能。写出实验报告(包括源程序和运行结果)。

[实现提示]

(1)建立一个带头结点的单向链表(无序)。

(2)对单链表进行插入,删除,更新操作。

(3)在主函数中设计一个简单的菜单,分别调试上述算法。

*/

#include

#include

#include

#define SEEK_SET 0

int num=0;

FILE *fp;

char filename[30];

typedef struct NodeType{

int Wno;

char Wname[20];

char Wsex[2];

char Wbirth[10];

char Wduty[24];

int Wphone;

char Waddress[20];

struct NodeType *next;

}Node;

Node * create_list()

{

Node * head;

head = (Node *)malloc(sizeof(Node));

head->next=NULL;

return head;

}

Node *InsertList(Node *head)

{

char ch;

Node *p=head->next,*q;

ch = 'y';

while(ch!='N' && ch!='n')

{

q=(Node *)malloc(sizeof(Node));

printf("请输入第%d员工信息:\n",num+1);

printf("员工号码:");

scanf("%d",&q->Wno);

printf("员工姓名:");

scanf("%s%*c",q->Wname);

//fflush(stdin);

printf("员工性别(男or女):");

scanf("%s%*c",q->Wsex);

///fflush(stdin);

printf("员工生日:(1999-09-09)");

scanf("%s%*c",q->Wbirth);

///fflush(stdin);

printf("员工职责:");

scanf("%s%*c",q->Wduty);

printf("员工电话:");

scanf("%d",&q->Wphone);

printf("员工住址:");

scanf("%s%*c",q->Waddress);

///fflush(stdin);

q->next = p;

head->next = q;

p=head->next;

num++;

printf("成功输入数据,现在已有%d位员工的信息保存!",num);

printf("是否继续输入(YorN)?");

scanf("%c",&ch);

}

return head;

}

Node *Select(Node *head,int Wno,int flag) //flag=1 获取当前位置,其他则返回前一位置

{

Node *p,*q;

int mark=0;

putchar(10);

if(head->next == NULL)

{

printf("无任何信息!\n");

return NULL;

}

q=head;

p=q->next;

while(p)

{

if(Wno == p->Wno)

{

printf("已找到,信息如下:\n");

printf("%d,%s,%s,%s,%s,%d,%s\n",p->Wno,p->Wname,p->Wsex,p->Wbirth,p->Wduty,p->Wphone,p->Waddress);

mark=1;

break;

}

else

{

q=q->next; //q前一位置

p=p->next;

//if(p->next == NULL) break;

}

}

if(mark==0)

{

printf("查无此信息!\n");

return NULL;

}

else

if(flag == 1 )return p; //当前位置

else return q; //上一位

}

void *Delete(Node *head,int Wno)

{

Node *p,*q;

p=Select(head,Wno,0);

q=p->next;

putchar(10);

printf("此人的工号为%d \n",q->Wno);

p->next=q->next;

free(q);

p = Select(head,Wno,1);

}

void update(Node *head,int Wno)

{

Node *p;

int i=0;

p=Select(head,Wno,1);

if(p)

{

do{

printf("\n\n\t 更 新\n");

printf("\t更新姓名--------1\n");

printf("\t更新性别--------2\n");

printf("\t更新生日--------3\n");

printf("\t更新职责--------4\n");

printf("\t更新电话--------5\n");

printf("\t更新地址--------6\n");

printf("\t结束更新--------7\n");

printf("\t\t请输入您的选择:");

scanf("%d",&i);

switch(i)

{

case 1:

printf("请输入姓名:");

scanf("%s%*c",p->Wname);

break;

case 2:

printf("请输入性别:");

scanf("%s%*c",p->Wsex);

break;

case 3:

printf("请输入生日:");

scanf("%s%*c",p->Wbirth);

break;

case 4:

printf("请输入职责:");

scanf("%s%*c",p->Wduty);

break;

case 5:

printf("请输入电话:");

scanf("%d",p->Wphone);

break;

case 6:

printf("请输入地址:");

scanf("%s%*c",p->Waddress);

break;

default:

break;

}

}while(i<7);

printf("工号\t 姓名\t 性别\t 出生日期\t 职责\t 手机号\t 联系地址\t\n");

printf("%10d,%10s,%2s,%10s,%10s,%15d,%20s\n",p->Wno,p->Wname,p->Wsex,p->Wbirth,p->Wduty,p->Wphone,p->Waddress);

putchar(10);

}

}

void Destory(Node *head)

{

Node *p,*q;

p=head;

q=head->next;

while(p)

{

free(p);

p=q;

if(q)

q=q->next;

}

}

void traserval(Node *head) //遍历

{

Node *p;

p=head;

printf("\n\n\t全部信息:\n");

while(1)

{

if(p->next == NULL) break;

p = p->next;

printf("工号\t 姓名\t 性别\t 出生日期\t 职责\t 手机号\t 联系地址\t\n");

printf("%10d,%10s,%2s,%10s,%10s,%15d,%20s\n",p->Wno,p->Wname,p->Wsex,p->Wbirth,p->Wduty,p->Wphone,p->Waddress);

}

}

void QListSort(Node **head,Node *end)// 快速排序

{

Node *right;

Node **left_walk, **right_walk;

Node *pivot, *old;

int count, left_count, right_count;

if (*head == end)

return;

do {

pivot = *head;

left_walk = head;

right_walk = &right;

left_count = right_count = 0;

//取第一个节点作为比较的基准,小于基准的在左面的子链表中,

//大于基准的在右边的子链表中

for (old = (*head)->next; old != end; old = old->next) {

if (old->Wno < pivot->Wno) { //小于基准,加入到左面的子链表,继续比较

++left_count;

*left_walk = old; //把该节点加入到左边的链表中,

left_walk = &(old->next);

} else { //大于基准,加入到右边的子链表,继续比较

++right_count;

*right_walk = old;

right_walk = &(old->next);

}

}

//合并链表

*right_walk = end; //结束右链表

*left_walk = pivot; //把基准置于正确的位置上

pivot->next = right; //把链表合并

//对较小的子链表进行快排序,较大的子链表进行迭代排序。

if(left_walk > right_walk) {

QListSort(&(pivot->next), end);

end = pivot;

count = left_count;

} else {

QListSort(head, pivot);

head = &(pivot->next);

count = right_count;

}

} while (count > 1);

}

void creatfile()

{

printf("\n请输入文件名:");

scanf("%s",filename); /*创建一个文件的名字*/

if((fp=fopen(filename,"w"))==NULL) /*打开文件,实现向文件输入数据*/

{

printf("\n不能建立!");

exit(0);

}

else

printf("已成功建立%s",filename);

fclose(fp);

}

void output(Node *head)

{

int i;

Node *p;

p=head->next;

creatfile();

if((fp=fopen(filename,"wb"))==NULL) /*打开文件*/

{

printf("\n不能打开该文件!");

exit(0);

}

fputs("员工信息",fp);

fputc(10,fp);

while(p)

{

if(fwrite(&p->Wno,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n");

if(fwrite(&p->Wname,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n");

if(fwrite(&p->Wsex,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n");

if(fwrite(&p->Wbirth,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n");

if(fwrite(&p->Wduty,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n");

if(fwrite(&p->Wphone,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n");

if(fwrite(&p->Waddress,sizeof(p),1,fp)!=1) printf("\n\t无法写入!\n");

fputc(10,fp);

i++;

p=p->next;

}

fscanf(fp,"共计%d人",num);

fputc(10,fp);

fclose(fp);

printf("\t已经成功内容写入到%s了!\n",filename);

}

int menu(int i)

{

putchar(10);

putchar(10);

putchar(10);

printf("\t┏━━━━━━━━━━人事管理系统━━━━━━━━━━━━┓\n");

printf("\t┃ ┃\n");

printf("\t┃ ┃\n");

printf("\t┃ 1、添加员工信息 ……………………………… 1 ┃\n");

printf("\t┃ 2、更新员工信息 ……………………………… 2 ┃\n");

printf("\t┃ 3、删除员工信息 ……………………………… 3 ┃\n");

printf("\t┃ 4、员工信息排序 ……………………………… 4 ┃\n");

printf("\t┃ 5、查找相关员工 ……………………………… 5 ┃\n");

printf("\t┃ 6、输出文件 ……………………………… 6 ┃\n");

printf("\t┃ 7、全部信息输出 ……………………………… 7 ┃\n");

printf("\t┃ 8、退出系统 ……………………………… 8 ┃\n");

printf("\t┃ ┃\n");

printf("\t┃ ┃\n");

printf("\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");

printf("\t\t\t请选择: ");

scanf("%d",&i);

putchar(10);

return i;

}

int main()

{

int i=0,Wno;

Node *p;

p=create_list();

system("mode con: cols=120 lines=40");

while(i<8)

{

i=menu(i);

if(i==8)

{

system("cls");

printf("\n\n\n\t\t\t\谢谢使用\n\n\n\n\n\t");

break;

}

switch(i)

{

case 1:

p=InsertList(p);

//traserval(p);

break;

case 2:

printf("请输入更新员工的工号: ");

scanf("%d",&Wno);

update(p,Wno);

break;

case 3:

printf("请输入删除的工号:");

scanf("%d",&Wno);

Delete(p,Wno);

traserval(p);

break;

case 4:

QListSort(&(p->next),NULL);

traserval(p);

break;

case 5:

printf("请输入查找的工号: ");

scanf("%d",&Wno);

Select(p,Wno,1);

break;

case 6:

output(p);

break;

case 7:

traserval(p);

break;

default:

break;

}

}

Destory(p);

return 0;

}

海译翻译

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值