数据结构,企业员工管理系统的快速排序无法实现

因为字数限制删掉了修改,求大佬帮忙!!解救秃头的少女吧!!求求了!!

#include <stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<malloc.h>
#define INITLISTSIZE 500
#define LISTINCREMENT 20
#define MAX 32767
#define N 500

int n;//n为当前职工数

typedef struct worker           //员工信息存储结构
{
    char sex;                   //男:M 女:W
    char name[N];              //姓名
    int  salary;                //工资
    int  bonus;                 //奖金
    char position[N];          //职务
    int  age;                   //年龄
    char num[N];               //工号
    int order;
}workers;

typedef struct SqList           //顺序表存储结构
{
    workers *elem;
    int listsize;
    int length;
}SqList;
//初始化
void Init(SqList &L)
{
    L.elem=(worker *)malloc(INITLISTSIZE*sizeof(worker));
    L.length=0;
}
//菜单
int Menu()
{
    int choice;
            printf("\t职 工 信 息 管 理 系 统\n");
            printf("==================员工信息管理==================\n ");
            printf("               1.录入职工信息\n ");
            printf("               2.修改职工信息\n ");
            printf("               3.浏览职工信息\n ");
            printf("               4.查询职工信息\n ");
            printf("               5.删除职工信息\n ");
            printf("               6.保存职工信息\n ");
            printf("               7.读取职工信息\n ");
            printf("               8.新增职工信息\n ");
            printf("               0.退出\n ");
            printf("输入你选择的序号:");
            scanf("%d",&choice);
            return choice;
}
//录入员工信息
void Create(SqList &L)
{
    int i=n,j;
    Init(L);
    while(1)
    {
        printf("请输入工号");
        printf("(ps:输入0则返回菜单):\n");
        scanf("%s",L.elem[i].num);
        for (j = 0; j<i; j++)
        {
        if (strcmp(L.elem[i].num, L.elem[j].num) == 0)
        {
                        printf("该工号已存在,请重新输入!\n");
                        break;
                    }
        }
        if (strcmp(L.elem[i].num,"0") == 0)
            break;
        printf("请输入姓名:");
        scanf("%s",L.elem[i].name);
        printf("请输入年龄:");
        scanf("%d",&L.elem[i].age);
        printf("请输入工资:");
        scanf("%d",&L.elem[i].salary);
        printf("请输入奖金:");
        scanf("%d",&L.elem[i].bonus);
        printf("请输入职位:\n");
        scanf("%s",L.elem[i].position);
        printf("请输入性别:\n");
        getchar();
        scanf("%c",&L.elem[i].sex);
        n++;
        i++;
    }
    L.length=n;
}
//插入
void Insert(SqList &L) 
{
    int i,j,flag=1,m;
    i=n;
    printf("请输入待增加信息的员工数:\n");
    scanf("%d", &m);
    if (m > 0)
    {
        do
    {
        flag=1;
    while(flag)
    {
        flag=0;
        printf("请输入工号:");
        printf("\n提示:输入0返回主菜单!\n");
        scanf("%s",L.elem[i].num);
        if (strcmp(L.elem[i].num, "0") == 0)
            break;
        for (j = 0; j <i; j++)
          {printf("               7.读取职工信息\n ");
            if (strcmp(L.elem[i].num, L.elem[j].num) == 0)
            {
            printf("该工号已存在,请重新输入!\n");
            flag=1;
            break;
            }
          }
    }
        printf("请输入性别:");
        scanf("%s",&L.elem[n].sex);
        printf("请输入姓名:");
        getchar();
        gets(L.elem[n].name);
        printf("请输入工资:");
        scanf("%d",&L.elem[n].salary);
        printf("请输入奖金:");
        scanf("%d",&L.elem[n].bonus);
        printf("请输入职务:");
        scanf("%s",L.elem[n].position);
        printf("请输入年龄:");
        scanf("%d",&L.elem[n].age);
        printf("提示:已经完成一条记录的添加!\n");
        L.length++;
       if (0 == flag)
                i++;
    }while(i<n+m);
}
        n += m;
        printf("员工信息增加完毕!!!\n");
        system("pause");
}
//按工资直接插入排序
void Insert_Sort(SqList &L)
{
    workers p;
    int i,j;
    for (i=0;i<n;i++)
        if (L.elem[i].salary>L.elem[i-1].salary)
        {
            p=L.elem[i];
            for (j=i-1;j>=0&&L.elem[j].salary<p.salary; j--)
                L.elem[j+1]=L.elem[j];
            L.elem[j+1]=p;
        }
    workers *t;
    i=0;
    for(t=L.elem;t<L.elem+n;t++)
    {
        L.elem[i].order=i+1;
        i++;
    }
}
//按学号快速排序
void Quick(SqList &L,int low,int high)
{
    workers nnum=L.elem[low];
    int i=low,j=high;
    if(low>=high)
        return;
    while(i<j)
    {
        while(i<j&&L.elem[j].num>=nnum.num)
            --j;//从右往左找工号比枢轴小的
        L.elem[i]=L.elem[j];//j移动到i
        while(i<j&&L.elem[i].num<=nnum.num)
            ++i;//从左往右找工号比枢轴大的
        L.elem[j]=L.elem[i];//i移动到j
    }
    L.elem[i]=nnum;
    Quick(L,low,i-1);
    Quick(L,i+1,high);
}
//按奖金折半插入排序
void sort2(SqList &L)
{
int i, j, mid, low, high;
workers temp;
for (i = 1; i < n; i++)
{
    if(L.elem[i].bonus<L.elem[i-1].bonus)
{
temp = L.elem[i];
low = 0;
high = i-1;
while (low <= high)
{
mid = (low + high) / 2;
if (temp.bonus < L.elem[mid].bonus)
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high+1; j--)
L.elem[j+1]=L.elem[j];
L.elem[high+1]=temp;
}
}
}
//显示
void display(SqList L)
{
    int i;
    printf("共有%d职工的信息:\n", n);
    if (0!=n)
    {
        printf("工号 \t姓名 \t年龄\t性别\t职务\t工资 \t奖金\n");
        printf("--------------------------------------------------------------------\n");
        for (i=0;i<n;i++)
        {
            printf("%s\t%s\t%d \t%c \t%s\t%d \t%d\n",L.elem[i].num,L.elem[i].name,L.elem[i].age,
             L.elem[i].sex,L.elem[i].position,L.elem[i].salary,L.elem[i].bonus);
        }
    }
    system("pause");
}
//按姓名查找
void search1(SqList &L) {
   int low = 0, high = n, mid, flag = 0;
  printf("\n");
  printf("按姓名查找-->请输入要查找的姓名:");
  char a[15];
  scanf("%s", a);
  while (low <= high) {
   mid = (low + high) / 2;
   if (strcmp(a, L.elem[mid].name) == 0) {
    flag = 1;
    break;
   } else if (strcmp(a, L.elem[mid].name)>0)
    low = mid + 1;
   else
    high = mid - 1;
  }
  if (flag == 1) {
   printf("查找成功-->该职工信息为:\n");
    printf("工号:%s \n姓名:%s \n工资:%d \n奖金:%d \n年龄:%d \n职务:%s \n性别:%c\n",L.elem[mid].num,L.elem[mid].name, L.elem[mid].salary,L.elem[mid].bonus,L.elem[mid].age,L.elem[mid].position,L.elem[mid].sex);
  }
  else {
   printf("该职工不存在!");
   }
  }
 
//按工号查找
void Binary_Search(SqList &L)
{
        char search_number[11];
    printf("输入要查找的工号:");
    scanf("%s",search_number);
    int low=0,high=n-1;
    while(low<=high)
    {
        int mid=(low+high)/2;
        if(strcmp(L.elem[mid].num,search_number)==0)
        {
             printf("工号:%s \n姓名:%s \n工资:%d \n奖金:%d \n年龄:%d \n职务:%s \n性别:%c\n",L.elem[mid].num,L.elem[mid].name, L.elem[mid].salary,L.elem[mid].bonus,L.elem[mid].age,L.elem[mid].position,L.elem[mid].sex);
            return;
        }
        else if(strcmp(L.elem[mid].num,search_number)<0)
            low=mid+1;
        else if(strcmp(L.elem[mid].num,search_number)>0)
            high=mid-1;
    }
    printf("错误!!!没有此职工信息!\n");
}
//查找
void search(SqList &L)
{
    int item,flag;
          printf("1.按工号查找\n");
          printf("2.按姓名查找\n");
          printf("3.返回菜单\n");
          while(1)
          { printf("==========请输入查询职工信息的类型==========\n");
          scanf("%d",&item);
          flag=0;
          switch(item)
          {
          case 1:
               flag=1;Binary_Search(L);break;
          case 2:
               flag=1;search1(L);break;
          case 3:return;
          default:printf("输入错误");
          }
          }
}
//浏览
void Display(SqList &L)
{
    int item,flag;
          printf("1.按工号排序(由小到大)\n");
          printf("2.按工资排序(由高至低)\n");
          printf("3.按奖金排序(由低至高)\n");
          printf("4.显示结果\n");
          printf("5.返回菜单\n");
          while(1)
          { printf("==========请输入浏览方式==========\n");
          scanf("%d",&item);
          flag=0;
          switch(item)
          {
          case 1:
              flag=1;Quick(L,1,n-1);break;
          case 2:
                flag=1;Insert_Sort(L);break;
          case 3:flag=1;sort2(L);break;
          case 4:flag=1;display(L);break;
          case 5:return;
          default:printf("输入错误");
          }
          }
}
//删除
void Del(SqList &L)
{
    int i, j, flag = 0;
    char s1[N];
    printf("请输入要删除的职工的工号:\n");
    scanf("%s", s1);
    for (i = 0;i<n; i++)
    {
        if ((strcmp(L.elem[i].num, s1) == 0)||(strcmp(L.elem[i].name,s1)==0))
        {
            flag = 1;
            //要删除职工后面的职工往前移一位
            for (j=i;j<n-1;j++)
                L.elem[j]= L.elem[j + 1];
        }
    }
        if (0 == flag){
            printf("该工号不存在!!!\n");
        }
        if (1 == flag){
            printf("删除成功!!!");
            //删除成功,职工数减1
            n--;
        }
        system("pause");
}
//保存
void Save(SqList L)
{
    int i;
    FILE *fp;
    if((fp=fopen("C:\\worker.txt","w"))==NULL)
    {
        printf("文件打开失败\n");
        getchar();
        exit(1);
    }
     for (i = 0; i < n; i++)
     {
        fprintf(fp, "%s %s %d %d %d  %s %c\n", L.elem[i].num,L.elem[i].name,L.elem[i].age,L.elem[i].salary,L.elem[i].bonus,L.elem[i].position,L.elem[i].sex);
    }
    fclose(fp);
}
//文件读取
int Load(SqList &L)
{
    int i = 0;
    FILE *fp;
    Init(L);
    if ((fp = fopen("C:\\worker.txt", "r")) == NULL) exit(1);
    //从文件读取信息
    while (fscanf(fp, "%s %s %d %d %d  %s %c\n", L.elem[i].num,L.elem[i].name,L.elem[i].age,L.elem[i].salary,L.elem[i].bonus,L.elem[i].position,L.elem[i].sex) == 7)
    {
        i++;
    }
    n =i;
    printf("刷新成功!!!");
    system("pause");
return 0;}
int main()
{
    SqList L;
    while(1)
    {
        switch(Menu())
        {
        case 1:Create(L);break;//录入
        case 2:modify(L);break;//修改
        case 3:Display(L);break;//浏览
        case 4:search(L);break;//查找
        case 5:Del(L);break;//删除
        case 6:Save(L);break;//保存
        case 7:Load(L);break;//读取
        case 8:Insert(L);break;//插入
        case 0:exit(0);
        }
    }
    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^