数据结构上机应用:线性表

问题描述:

某软件公司年初有n名员工,每名员工有姓名、职务、工号等属性,现在该公司还有共m次操作,分别对应了员工的入职、离职、查询。现在请把所有员工建立一个线性表,建立离职、入职、查询函数,当有员工离职或入职时,修改线性表,并且根据输出格式中的要求输出。

要求实现顺序表的插入、删除、查找、输出等基本操作;调用基本操作完成。

1.顺序表存储

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MSIZE 100

typedef struct {
    char **name;
    char **job;
    char **num;
    int len;
    int listsize;
}list;
//定义一个顺序表,存储姓名,职务,和工号,字符串数组利用二维指针保存

void InitList(list &L) {
    L.name = (char**)malloc(MSIZE*MSIZE*sizeof(char*));
    for(int i = 0; i < MSIZE; i++) {
        L.name[i] = (char*)malloc(MSIZE*sizeof(char));
    }
    L.job = (char**)malloc(MSIZE*MSIZE*sizeof(char*));
    for(int i = 0; i < MSIZE; i++) {
        L.job[i] = (char*)malloc(MSIZE*sizeof(char));
    }
    L.num = (char**)malloc(MSIZE*MSIZE*sizeof(char*));
    for(int i = 0; i < MSIZE; i++) {
        L.num[i] = (char*)malloc(MSIZE*sizeof(char));
    }
    L.len = 0;
    L.listsize = MSIZE;
}
//新建顺序表,申请存储空间

void Getlist(list &L) {
    printf("请输入公司原有的员工数量(100以内)\n");
    scanf("%d", &L.len);
    printf("请在每行按照以下格式输入:\n姓名 职务 工号\n");
    for(int i = 0; i < L.len; i++) {
        scanf("%s %s %s", L.name[i], L.job[i], L.num[i]);
    }
    printf("基本数据获取完成\n");
}
//获取初始的数据,存到顺序表

void Outlist(list &L) {
    printf("所有员工数据为:\n");
    for(int i = 0; i < L.len; i++) {
        printf("%d. 姓名:%s 职务:%s 工号:%s\n", i, L.name[i], L.job[i], L.num[i]);
    }
}
//打印顺序表函数

int Insert(list &L) {
    L.len++;
    if(L.len > MSIZE) {
        printf("列表已满,操作失败\n");
        L.len = MSIZE;
        return 0;
    }
    printf("请按照格式输入员工的信息:\n姓名 职务 工号\n");
    scanf("%s", L.name[L.len - 1]);
    scanf("%s", L.job[L.len - 1]);
    scanf("%s", L.num[L.len - 1]);
    return 0;
}
//员工入职,加入列表末尾位置

int Dele(list &L, int p) {
    if(p < 0 || p > L.len - 1) {
        printf("删除的位置不合法,操作失败\n");
        return 0;
    }
    char **name = &L.name[p], **job = &L.job[p], **num = &L.num[p];
    for(int i = p; p < L.len - 1; i++) {
        L.name[i] = L.name[i + 1];
        L.job[i] = L.job[i + 1];
        L.num[i] = L.num[i + 1];
    }
    L.len--;
    printf("姓名:%s 职务:%s 工号:%s 已删除\n", *name, *job, *num);
    return 0;
}
//员工离职,指定位置删除

void Search(list &L) {
    printf("请选择查找方式(输入对应编号):\n1.按照姓名查找\n2.按照职务查找\n3.按照工号查找\n");
    int mode;
    scanf("%d", &mode);
    if(mode == 1) {
        char name[MSIZE];
        int flag = 0;//flag作为一个标识符,表示是否有查找到
        printf("请输入姓名\n");
        scanf("%s", name);
        for(int i = 0; i < L.len; i++) {
            if(strcmp(name, L.name[i]) == 0) {
                flag = 1;
                printf("表中位置:%d. 姓名:%s 职务:%s 工号:%s\n", i, L.name[i], L.job[i], L.num[i]);
            }
        }
        if(flag == 0) printf("没有找到\n");
    }

    if(mode == 2) {
        char job[MSIZE];
        int flag = 0;//flag作为一个标识符,表示是否有查找到
        printf("请输入职务\n");
        scanf("%s", job);
        for(int i = 0; i < L.len; i++) {
            if(strcmp(job, L.job[i]) == 0) {
                flag = 1;
                printf("表中位置:%d. 姓名:%s 职务:%s 工号:%s\n", i, L.name[i], L.job[i], L.num[i]);
            }
            //可能有多个人职务一样,故在此不会结束循环
        }
        if(flag == 0) printf("没有找到\n");
    }

    if(mode == 3) {
        char num[MSIZE];
        int flag = 0;//flag作为一个标识符,表示是否有查找到
        printf("请输入工号\n");
        scanf("%s", num);
        for(int i = 0; i < L.len; i++) {
            if(strcmp(num, L.num[i]) == 0) {
                flag = 1;
                printf("表中位置:%d. 姓名:%s 职务:%s 工号:%s\n", i, L.name[i], L.job[i], L.num[i]);
                break;
            }
        }
        if(flag == 0) printf("没有找到\n");
    }
}
//查找员工

int main() {
    list L;
    InitList(L);//初始化列表L
    Getlist(L);//获取初始数据
    Outlist(L);
    int a;
    do {
        printf("\n接下来你想进行的操作是(输入数字):\n1.员工入职\n2.员工离职\n3.查找员工\n4.查看所有数据\n5.结束程序\n");
        scanf("%d", &a);
        printf("\n");
        if(a == 1) {
            Insert(L);
            Outlist(L);

        }
        if(a == 2) {
            int p;
            printf("请输入要在表中删除的位置\n");
            scanf("%d", &p);
            Dele(L, p);
            Outlist(L);
        }
        if(a == 3) {
            Search(L);
        }
        if(a == 4) {
            Outlist(L);
        }
    } while(a != 5);
    return 0;
}


2.链表存储

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MSIZE 100

typedef struct emp{
    char name[MSIZE];
    char job[MSIZE];
    char num[MSIZE];
    emp *next;
}emp;
//定义一个链表,存储姓名,职务,和工号,字符串数组利用二维指针保存

void InitList(emp *L) {
    L = (emp *)malloc(sizeof(emp));
    L->next = NULL;
}

void Getlist(emp *L) {
    L->next = NULL;
    int n;
    emp *p;
    printf("请输入公司原有的员工数量\n");
    scanf("%d", &n);
    printf("请在每行按照以下格式输入:\n姓名 职务 工号\n");
    for(int i = 0; i < n; i++) {
        p = (emp*)malloc(sizeof(emp));
        scanf("%s %s %s", p->name, p->job, p->num);
        p->next = L->next;
        L->next = p;
    }
    printf("基本数据获取完成\n");
}
//获取初始的数据,存到链表

void Outlist(emp *L) {
    int i = 0;
    emp *p;
    p = L->next;
    printf("所有员工数据为:\n");
    while(p != NULL) {
        i++;
        printf("%d. 姓名:%s 职务:%s 工号:%s\n", i, p->name, p->job, p->num);
        p = p->next;
    }
    printf("总共有%d人\n", i);
}
//打印链表存储的数据

void Insert(emp *L) {
    emp *p;
    p = (emp*)malloc(sizeof(emp));
    printf("请按照格式输入员工的信息:\n姓名 职务 工号\n");
    scanf("%s %s %s", p->name, p->job, p->num);
    p->next = L->next;
    L->next = p;
}
//员工入职,加入列表头部

int Dele(emp *L, int n) {
    emp *p, *t;
    p = L->next;
    for(int i = 0; i < n - 2; i++) {
        p = p->next;
    }
    t = p->next;
    p->next = t->next;
    printf("姓名:%s 职务:%s 工号:%s 已删除\n", t->name, t->job, t->num);
    free(t);
    return 0;
}
//员工离职,指定位置删除

void Search(emp *L) {
    printf("请选择查找方式(输入对应编号):\n1.按照姓名查找\n2.按照职务查找\n3.按照工号查找\n");
    int mode;
    scanf("%d", &mode);
    if(mode == 1) {
        int i = 0;
        emp *p;
        p = L->next;
        char name[MSIZE];
        int flag = 0;//flag作为一个标识符,表示是否有查找到
        printf("请输入姓名\n");
        scanf("%s", name);
        while(p != NULL) {
            i++;
            if(strcmp(name, p->name) == 0) {
                flag = 1;
                printf("表中位置:%d. 姓名:%s 职务:%s 工号:%s\n", i, p->name, p->job, p->num);
            }
            p = p->next;
        }
        if(flag == 0) printf("没有找到\n");
    }

    if(mode == 2) {
        int i = 0;
        emp *p;
        p = L->next;
        char job[MSIZE];
        int flag = 0;//flag作为一个标识符,表示是否有查找到
        printf("请输入职务\n");
        scanf("%s", job);
        while(p != NULL) {
            i++;
            if(strcmp(job, p->job) == 0) {
                flag = 1;
                printf("表中位置:%d. 姓名:%s 职务:%s 工号:%s\n", i, p->name, p->job, p->num);
                p = p->next;
            }
            p = p->next;
        }
        if(flag == 0) printf("没有找到\n");
    }

    if(mode == 3) {
        int i = 0;
        emp *p;
        p = L->next;
        char num[MSIZE];
        int flag = 0;//flag作为一个标识符,表示是否有查找到
        printf("请输入工号\n");
        scanf("%s", num);
        while(p != NULL) {
            i++;
            if(strcmp(num, p->num) == 0) {
                flag = 1;
                printf("表中位置:%d. 姓名:%s 职务:%s 工号:%s\n", i, p->name, p->job, p->num);
                break;
            }
            p = p->next;
        }
        if(flag == 0) printf("没有找到\n");
    }
}
//查找员工

int main() {
    emp *L;
    L = (emp *)malloc(sizeof(emp));
    InitList(L);//初始化列表L
    Getlist(L);//获取初始数据
    Outlist(L);
    int a;
    do {
        printf("\n接下来你想进行的操作是(输入数字):\n1.员工入职\n2.员工离职\n3.查找员工\n4.查看所有数据\n5.结束程序\n");
        scanf("%d", &a);
        printf("\n");
        if(a == 1) {
            Insert(L);
            Outlist(L);

        }
        if(a == 2) {
            int p;
            printf("请输入要在表中删除的位置\n");
            scanf("%d", &p);
            Dele(L, p);
            Outlist(L);
        }
        if(a == 3) {
            Search(L);
        }
        if(a == 4) {
            Outlist(L);
        }
    } while(a != 5);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lijj0304/article/details/128314731