数据结构C语言_员工信息

/*根据实验内容编程,上机调试、得出正确的运行程序。系统能够完成员工信息的查询、
更新、插入、删除、排序功能。写出实验报告(包括源程序和运行结果)。
[实现提示]
(1)建立一个带头结点的单向链表(无序)。
(2)对单链表进行插入,删除,更新操作。
(3)在主函数中设计一个简单的菜单,分别调试上述算法。




*/


#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#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;
}



                                                                  海译翻译

你可能感兴趣的:(数据结构C语言_员工信息)