员工信息结构体如下:
typedef
struct
employee
{
int num;
float salary;
struct employee * next;
}EMP;
{
int num;
float salary;
struct employee * next;
}EMP;
本程序采用菜单进行控制,包含以下功能:
1、链表的创建
2、链表的插入(有序链表的插入)
3、链表的插入(按指定位置插入)
4、链表删除(按制定员工号删除)
5、从文件读入链表内容
6、保存链表内容到文件
7、显示链表内容
![ContractedBlock.gif](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include
<
stdio.h
>
#include < stdlib.h >
#include < conio.h >
#include < ctype.h >
#include < windows.h >
#define LEN sizeof(struct employee)
typedef struct employee
{
int num;
float salary;
struct employee * next;
}EMP;
int n;
/* 插入表尾 */
EMP * CreateEnd()
{
EMP * p, * last, * head;
n = 0 ;
head = last = NULL;
p = (EMP * )malloc(LEN); /* 创建第一个结点 */
printf( " 员工号\t工资\n " );
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = NULL;
while (p -> num != 0 ) /* 将结点加入链表 */
{
++ n;
if (n == 1 ) /* 是第一个结点,作表头 */
head = p;
else /* 不是第一个结点,作表尾 */
last -> next = p;
last = p;
p = (EMP * )malloc(LEN); /* 开辟下一个结点 */
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = NULL;
}
free(p); /* 释放最后一个结点所占的内存 */
return head; /* 返回链表的头指针 */
}
/* 插入表头 */
EMP * CreateStart()
{
EMP * head, * p;
n = 0 ;
head = NULL;
p = (EMP * )malloc(LEN);
printf( " 员工号\t工资\n " );
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = head;
while (p -> num != 0 )
{
++ n;
head = p;
p = (EMP * )malloc(LEN);
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = head;
}
free(p);
return head;
}
/* 链表显示 */
void list(EMP * head)
{
EMP * p;
printf( " \n%d个职工信息如下:\n " ,n);
printf( " 员工号\t工资\n " );
p = head;
if (head != NULL)
{
do
{
printf( " %d\t%.2f\n " ,p -> num,p -> salary);
p = p -> next;
} while (p != NULL);
}
else
printf( " 无员工信息记录!\n " );
}
EMP * insert_sort(EMP * head) // 按照员工号从小到大顺序插入
{
EMP * p0, * p1, * p2;
p1 = p2 = head; /* p1指向第一个结点 */
printf( " 请输入要插入员工的信息:\n " );
p0 = (EMP * )malloc(LEN);
scanf( " %d%f " , & p0 -> num, & p0 -> salary);
p0 -> next = NULL;
if (head == NULL) /* 原来是空表 */
{
head = p0;p0 -> next = NULL; /* 使p0指向的结点作为链表第一个结点 */
}
else
{
while ((p0 -> num > p1 -> num) && (p1 -> next != NULL)) // 防止空节点进行员工号比较,因此条件为p1->next!=NULL,而不是p1!=NULL
{
p2 = p1;p1 = p1 -> next; /* 找插入点 */
}
if (head == p1) /* 如果只有一个头结点 */
{
if (p0 -> num > head -> num) // 如果待插入节点员工号大于头结点员工号
head -> next = p0; // 待插入节点插入到头结点之后
else // 如果待插入节点员工号小于头结点员工号
{
p0 -> next = head;head = p0; // 待插入节点插入到头结点之前
}
}
else
{
if (p0 -> num > p1 -> num) // 如果待插入节点员工号大于最后节点的员工号
{
p1 -> next = p0; // 待插入节点插入到最后
}
else // 找到插入位置
{
p2 -> next = p0;p0 -> next = p1; // 插入到p2,p1之间
}
}
}
++ n;
return head;
}
EMP * insert_index(EMP * head) // 按指定位置插入员工信息
{
int i = 0 ,index;
EMP * p0, * p1, * p2;
p1 = p2 = head;
printf( " 请输入要插入员工的信息:\n " );
p0 = (EMP * )malloc(LEN);
scanf( " %d%f " , & p0 -> num, & p0 -> salary);
p0 -> next = NULL;
printf( " 请输入要插入的位置: " );
scanf( " %d " , & index);
if (head == NULL) // 如果原来链表是空的,头结点指向新插入的结点
{
head = p0;p0 -> next = NULL;
}
else
{
while (p1 != NULL && i < index - 1 ){
p2 = p1;p1 = p1 -> next; // 找插入点
i ++ ;
}
if (p1 == head) // 如果插入点是第一位
{
p0 -> next = head;head = p0;
}
else // 插入到指定的位置
{
p2 -> next = p0;p0 -> next = p1;
}
}
++ n;
return head;
}
EMP * del(EMP * head)
{
EMP * p1, * p2;
int num;
printf( " 请输入要删除的员工编号:\n " );
scanf( " %d " , & num);
if (head == NULL)
{
printf( " \n链表为空!\n " ); /* 链表为空 */
goto end;
}
p1 = p2 = head; /* 从头结点开始查找 */
while (num != p1 -> num && p1 -> next != NULL) /* p1指向的不是所要找的结点,并且没有到表尾 */
{
p2 = p1;p1 = p1 -> next; /* 后移一个结点 */
}
if (num == p1 -> num) /* 找到需要删除的结点 */
{
if (p1 == head) /* p1指向的是头结点 */
head = p1 -> next; /* 第二个结点成为新的头结点 */
else
p2 -> next = p1 -> next; /* 后继结点的地址赋给前一结点 */
printf(员工号为 % d的信息已经被删除\n " ,num);
free(p1);
n -- ;
}
else
printf( " 没有发现 %d 号员工的信息!\n " ,num);
end:
return head;
}
int writeInfo(EMP * head)
{
FILE * fp;
EMP * p;
p = head;
if ((fp = fopen( " test.txt " , " w " )) == NULL)
{
printf( " 打开文件失败! " );
exit( 0 );
}
while (p != NULL)
{
fprintf(fp, " %d %.2f\n " ,p -> num,p -> salary);
p = p -> next;
}
printf( " 链表保存成功!\n " );
fclose(fp);
}
EMP * readInfo()
{
FILE * fp;
EMP * p, * last, * head;
n = 0 ;
head = last = NULL;
if ((fp = fopen( " test.txt " , " r " )) == NULL)
{
printf( " 打开文件失败! " );
exit( 0 );
}
p = (EMP * )malloc(LEN);
while (fscanf(fp, " %d %f " , & p -> num, & p -> salary) != EOF)
{
p -> next = NULL;
++ n;
if (n == 1 )
head = p;
else
last -> next = p;
last = p;
p = (EMP * )malloc(LEN);
}
free(p);
printf( " 链表读入成功!\n " );
fclose(fp); // 关闭文件
return head; /* 返回链表的头指针 */
}
void main()
{
EMP * head, * emp;
int del_num,index;
char letter;
do
{
printf( " ********************************\n " );
printf( " A 创建链表\n " );
printf( " B 插入员工信息(按员工号排序插入)\n " );
printf( " C 插入员工信息(按指定位置插入)\n " );
printf( " D 删除员工信息\n " );
printf( " E 读入链表内容\n " );
printf( " F 保存链表内容\n " );
printf( " G 显示链表内容\n " );
printf( " Q 退出\n " );
printf( " ********************************\n " );
printf( " 请根据编号选择功能: " );
scanf( " %c " , & letter); // 注意:%c前面要加空格,用来吸收多余的回车符,否则会重复打印菜单
letter = toupper(letter);
switch (letter)
{
case ' A ' :
system( " cls " );
head = CreateEnd();
break ;
case ' B ' :
system( " cls " );
head = insert_sort(head,emp);
list(head);
break ;
case ' C ' :
system( " cls " );
head = insert_index(head);
list(head);
break ;
case ' D ' :
system( " cls " );
head = del(head);
list(head);
break ;
case ' E ' :
system( " cls " );
head = readInfo();
break ;
case ' F ' :
system( " cls " );
writeInfo(head);
break ;
case ' G ' :
system( " cls " );
list(head);
break ;
}
} while (letter != ' Q ' );
}
#include < stdlib.h >
#include < conio.h >
#include < ctype.h >
#include < windows.h >
#define LEN sizeof(struct employee)
typedef struct employee
{
int num;
float salary;
struct employee * next;
}EMP;
int n;
/* 插入表尾 */
EMP * CreateEnd()
{
EMP * p, * last, * head;
n = 0 ;
head = last = NULL;
p = (EMP * )malloc(LEN); /* 创建第一个结点 */
printf( " 员工号\t工资\n " );
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = NULL;
while (p -> num != 0 ) /* 将结点加入链表 */
{
++ n;
if (n == 1 ) /* 是第一个结点,作表头 */
head = p;
else /* 不是第一个结点,作表尾 */
last -> next = p;
last = p;
p = (EMP * )malloc(LEN); /* 开辟下一个结点 */
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = NULL;
}
free(p); /* 释放最后一个结点所占的内存 */
return head; /* 返回链表的头指针 */
}
/* 插入表头 */
EMP * CreateStart()
{
EMP * head, * p;
n = 0 ;
head = NULL;
p = (EMP * )malloc(LEN);
printf( " 员工号\t工资\n " );
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = head;
while (p -> num != 0 )
{
++ n;
head = p;
p = (EMP * )malloc(LEN);
scanf( " %d%f " , & p -> num, & p -> salary);
p -> next = head;
}
free(p);
return head;
}
/* 链表显示 */
void list(EMP * head)
{
EMP * p;
printf( " \n%d个职工信息如下:\n " ,n);
printf( " 员工号\t工资\n " );
p = head;
if (head != NULL)
{
do
{
printf( " %d\t%.2f\n " ,p -> num,p -> salary);
p = p -> next;
} while (p != NULL);
}
else
printf( " 无员工信息记录!\n " );
}
EMP * insert_sort(EMP * head) // 按照员工号从小到大顺序插入
{
EMP * p0, * p1, * p2;
p1 = p2 = head; /* p1指向第一个结点 */
printf( " 请输入要插入员工的信息:\n " );
p0 = (EMP * )malloc(LEN);
scanf( " %d%f " , & p0 -> num, & p0 -> salary);
p0 -> next = NULL;
if (head == NULL) /* 原来是空表 */
{
head = p0;p0 -> next = NULL; /* 使p0指向的结点作为链表第一个结点 */
}
else
{
while ((p0 -> num > p1 -> num) && (p1 -> next != NULL)) // 防止空节点进行员工号比较,因此条件为p1->next!=NULL,而不是p1!=NULL
{
p2 = p1;p1 = p1 -> next; /* 找插入点 */
}
if (head == p1) /* 如果只有一个头结点 */
{
if (p0 -> num > head -> num) // 如果待插入节点员工号大于头结点员工号
head -> next = p0; // 待插入节点插入到头结点之后
else // 如果待插入节点员工号小于头结点员工号
{
p0 -> next = head;head = p0; // 待插入节点插入到头结点之前
}
}
else
{
if (p0 -> num > p1 -> num) // 如果待插入节点员工号大于最后节点的员工号
{
p1 -> next = p0; // 待插入节点插入到最后
}
else // 找到插入位置
{
p2 -> next = p0;p0 -> next = p1; // 插入到p2,p1之间
}
}
}
++ n;
return head;
}
EMP * insert_index(EMP * head) // 按指定位置插入员工信息
{
int i = 0 ,index;
EMP * p0, * p1, * p2;
p1 = p2 = head;
printf( " 请输入要插入员工的信息:\n " );
p0 = (EMP * )malloc(LEN);
scanf( " %d%f " , & p0 -> num, & p0 -> salary);
p0 -> next = NULL;
printf( " 请输入要插入的位置: " );
scanf( " %d " , & index);
if (head == NULL) // 如果原来链表是空的,头结点指向新插入的结点
{
head = p0;p0 -> next = NULL;
}
else
{
while (p1 != NULL && i < index - 1 ){
p2 = p1;p1 = p1 -> next; // 找插入点
i ++ ;
}
if (p1 == head) // 如果插入点是第一位
{
p0 -> next = head;head = p0;
}
else // 插入到指定的位置
{
p2 -> next = p0;p0 -> next = p1;
}
}
++ n;
return head;
}
EMP * del(EMP * head)
{
EMP * p1, * p2;
int num;
printf( " 请输入要删除的员工编号:\n " );
scanf( " %d " , & num);
if (head == NULL)
{
printf( " \n链表为空!\n " ); /* 链表为空 */
goto end;
}
p1 = p2 = head; /* 从头结点开始查找 */
while (num != p1 -> num && p1 -> next != NULL) /* p1指向的不是所要找的结点,并且没有到表尾 */
{
p2 = p1;p1 = p1 -> next; /* 后移一个结点 */
}
if (num == p1 -> num) /* 找到需要删除的结点 */
{
if (p1 == head) /* p1指向的是头结点 */
head = p1 -> next; /* 第二个结点成为新的头结点 */
else
p2 -> next = p1 -> next; /* 后继结点的地址赋给前一结点 */
printf(员工号为 % d的信息已经被删除\n " ,num);
free(p1);
n -- ;
}
else
printf( " 没有发现 %d 号员工的信息!\n " ,num);
end:
return head;
}
int writeInfo(EMP * head)
{
FILE * fp;
EMP * p;
p = head;
if ((fp = fopen( " test.txt " , " w " )) == NULL)
{
printf( " 打开文件失败! " );
exit( 0 );
}
while (p != NULL)
{
fprintf(fp, " %d %.2f\n " ,p -> num,p -> salary);
p = p -> next;
}
printf( " 链表保存成功!\n " );
fclose(fp);
}
EMP * readInfo()
{
FILE * fp;
EMP * p, * last, * head;
n = 0 ;
head = last = NULL;
if ((fp = fopen( " test.txt " , " r " )) == NULL)
{
printf( " 打开文件失败! " );
exit( 0 );
}
p = (EMP * )malloc(LEN);
while (fscanf(fp, " %d %f " , & p -> num, & p -> salary) != EOF)
{
p -> next = NULL;
++ n;
if (n == 1 )
head = p;
else
last -> next = p;
last = p;
p = (EMP * )malloc(LEN);
}
free(p);
printf( " 链表读入成功!\n " );
fclose(fp); // 关闭文件
return head; /* 返回链表的头指针 */
}
void main()
{
EMP * head, * emp;
int del_num,index;
char letter;
do
{
printf( " ********************************\n " );
printf( " A 创建链表\n " );
printf( " B 插入员工信息(按员工号排序插入)\n " );
printf( " C 插入员工信息(按指定位置插入)\n " );
printf( " D 删除员工信息\n " );
printf( " E 读入链表内容\n " );
printf( " F 保存链表内容\n " );
printf( " G 显示链表内容\n " );
printf( " Q 退出\n " );
printf( " ********************************\n " );
printf( " 请根据编号选择功能: " );
scanf( " %c " , & letter); // 注意:%c前面要加空格,用来吸收多余的回车符,否则会重复打印菜单
letter = toupper(letter);
switch (letter)
{
case ' A ' :
system( " cls " );
head = CreateEnd();
break ;
case ' B ' :
system( " cls " );
head = insert_sort(head,emp);
list(head);
break ;
case ' C ' :
system( " cls " );
head = insert_index(head);
list(head);
break ;
case ' D ' :
system( " cls " );
head = del(head);
list(head);
break ;
case ' E ' :
system( " cls " );
head = readInfo();
break ;
case ' F ' :
system( " cls " );
writeInfo(head);
break ;
case ' G ' :
system( " cls " );
list(head);
break ;
}
} while (letter != ' Q ' );
}