我在C
中创建了一个堆栈系统它采用名字,姓氏和员工编号,程序运行正常。
#include<stdio.h>
#include<conio.h>
#define MAX 20
struct system
{
char first_name[15];
char surname[15];
}employee[20], temp;
int stack[MAX],front=-1,top=-1;
int i;
void push_element();
void pop_element();
void display_stack();
void display_first();
int main()
{
int option;
printf("STACK PROGRAM");
do
{
printf("\n\n 1.Push an element");
printf("\n 2.Pop an element");
printf("\n 3.Display stack");
printf("\n 4.Display first");
printf("\n 5.Display last");
printf("\n 6.Exit");
printf("\n Enter your choice: ");
scanf("%d",&option);
switch(option)
{
case 1: push_element();
break;
case 2: pop_element();
break;
case 3: display_stack();
break;
case 4: display_first();
break;
case 5: display_last();
break;
case 6: return 0;
}
}while(option!=6);
}
void push_element()
{
printf("\n Enter the first name: ");
scanf("%s",employee[i].first_name);
printf("\n Enter the Last name: ");
scanf("%s",employee[i].surname);
int num;
printf("\n Enter the employee number: ");
scanf("%d",&num);
i++;
if(front==0 && top==MAX-1)
printf("\n You have entered more than 20. Please delete a current input to make room. ");
else if(front==-1&&top==-1)
{
front=top=0;
stack[top]=num;
}
else if(top==MAX-1 && front!=0)
{
top=0;
stack[top]=num;
}
else
{
top++;
stack[top]=num;
}
}
void pop_element()
{
top--;
return top;
}
void display_stack()
{
int i;
if(front==-1)
printf("\n No Employees to display");
else
{
printf("\n List of employees:\n\n ");
printf(" Employee number First Name Surname\n\n");
for(i=front;i<=top;i++)
{
printf(" %d \t\t %s \t %s\n", stack[i], employee[i].first_name, employee[i].surname);
}
}
}
void display_first()
{
int i;
if(front==-1)
printf("\n No Employees to display");
else
{
printf("\n The first Employee in the stack is:\n\n ");
printf(" Employee number First Name Surname\n\n");
for(i=front;i<=top;i++)
break;
{
printf(" %d \t\t %s \t %s\n", stack[i], employee[i].first_name, employee[i].surname);
}
}
}
void display_last()
{
int i;
if(front==-1)
printf("\n No Employees to display");
else
{
printf("\n The last Employee in the stack is:\n \n");
printf(" Employee number First Name Surname\n\n");
for(i=top;i<=front;i++)
break;
{
printf(" %d \t\t %s \t %s\n", stack[i], employee[i].first_name, employee[i].surname);
}
}
}
我为我的生活无法弄清楚如何对堆栈进行排序。我尝试过其他代码和许多不同的东西,但是没有一个能够找到它 但我想按按字母顺序顺序对其进行排序。所以不是通过入职时间或员工编号,而是通过姓氏的第一个首字母
此处还需要搜索功能,并由员工编号完成。
我已经在线查看,在堆栈中使用排序和搜索并不常见,但我需要拥有它。
我不擅长C而且我对它很陌生。任何可能对我有帮助的提示或事情都将不胜感激。此外,我对任何格式错误表示歉意,对于完全编程和使用软件我是一个新手。
答案 0 :(得分:2)
您的数据结构不会直接记录员工编号。您有记录员工编号的数组stack
和记录名称的数组employee
。您需要保留关系 stack[i]
包含employee[i]
的员工编号,这意味着现有数据结构的任何排序都必须并行排序两个数组。虽然可以完成,但它不是解决问题的最佳方法(并且它比需要的更难,并且需要自定义排序功能)。
您应升级数据结构以包含员工编号:
struct employee
{
int number;
char first_name[15];
char surname[15];
} employee[20];
请注意,我已将结构重新标记为struct employee
(而不是struct system
),因为它似乎与结构内容更相关。
然后,您可以使用标准C库中的qsort()
函数(在<stdlib.h>
中声明)以及建议的副本(How to sort an array of structs in C?)中记录的技术来直接对数据进行排序。编写搜索代码也更容易。
您还可以清理显示代码;您可以拥有一个传递员工结构的单个函数(或指向一个的指针)。它将包含一个printf()
语句,可以正确格式化数据。这样可以节省您编写相同精细printf()
代码3次,从而可以在需要时(如果需要)更轻松地修复格式。您还可以避免在输出中使用制表符(通常是个好主意),导致:
void print_employee(const struct employee *emp)
{
printf("%8d %-15s %-15s\n", emp->number, emp->first_name, emp->surname);
}
这将产生良好对齐的输出,除非您的员工人数增长到8位以上(在这种情况下,将8更改为10或其他)。如果您愿意,还可以进一步概括一步,将FILE *fp
参数传递给函数,并使用fprintf(fp, "…", …)
代替printf()
。
您调用该函数:
print_employee(&employee[i]);
您可能还会考虑打印标题的功能,因为您有3次该功能调用。或者,您可能只在文件范围内有一个常量字符串,其中包含您在3个位置使用的正确标题。您也可以使用print_employee()
函数执行此操作;在文件范围内有一个常量字符串,这是您使用的格式。
此外,在您的display_first()
和display_last()
函数中,循环很奇怪。你已经写过:
for(i=front;i<=top;i++)
break;
{
printf(" %d \t\t %s \t %s\n", stack[i], employee[i].first_name, employee[i].surname);
}
您应该意识到(在审核时)这相当于:
i = front;
printf(" %d \t\t %s \t %s\n", stack[i], employee[i].first_name, employee[i].surname);
(如果front
大于top
,则i = front
是执行循环的唯一部分;否则,执行break
;无论如何,循环,i == front
。)