在堆栈中排序/搜索

时间:2014-05-10 18:16:17

标签: c stack

我在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而且我对它很陌生。任何可能对我有帮助的提示或事情都将不胜感激。此外,我对任何格式错误表示歉意,对于完全编程和使用软件我是一个新手。

1 个答案:

答案 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。)