线性表基础实践:实现对员工进行信息管理(结构体基础运用)

一、线性表定义

线性表 (Linear List) :由同类型 数据元素 构成 有序序列 的线性结构。
主要有 顺序储存结构链式储存结构两种结构各有优缺点。
①线性表的顺序存储实现: 利用数组的 连续存储空间顺序存放 线性表的各元素。
线性表的 链式存储 实现: 不要求逻辑上相邻的两个元素物理上也相邻 通过“链”建 立起数据元素之间的逻辑关系。

二、结构体基础

在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

结构体的定义:

C语言结构体类型的定义模板大概为:

struct 类型名{

    成员表列

} 变量;

•在成员表列中可以是几种基本数据类型,也可以是结构体类型。

•struct 类型名{} 变量;后的分号不能漏

以下是定义结构体类型的几种具体方法

1 先定义结构体类型,再定义结构体变量。

struct student{

    char no[20];       //学号

    char name[20];    //姓名

      char sex[5];    //性别

    int age;          //年龄

};             

struct student stu1,stu2;

//此时stu1,stu2为student结构体变量

2 定义结构体类型的同时定义结构体变量。

struct student{

    char no[20];        //学号

    char name[20];     //姓名

      char sex[5];      //性别

    int age;            //年龄

} stu1,stu2;    

//此时还可以继续定义student结构体变量如:

struct student stu3;

3 直接定义结构体变量。

struct{

    char no[20];        //学号

    char name[20];      //姓名

      char sex[5];      //性别

    int age;          //年龄

} stu1,stu2;    

一般不会使用第三种定义方法,因为直接定义结构体变量stu1,stu2后就不能再继续定义该类型的变量。

在C中定义结构体类型后每次定义变量时都要使用struct,如果嫌麻烦,我们可以这样:

typedef struct student{

    char no[20];       //学号

    char name[20];    //姓名

      char sex[5];    //性别

    int age;          //年龄

}STUDENT;

STUDENT stu1;

//使用typedef给struct student取一个“别名”STUDENT

三、实践运用

如实验资料包中“员工信息表.xlsx”(此处仅展示前五条信息)所示,现在拟对员工进行信息管理,请完成如下操作:

职务员工编号姓名工资等级岗位工资
董事长WL001表姐A510000
总经理WL002凌祯A49000
董事长秘书WL003邹新文A38500
秘书WL004李明B67000
秘书WL005翁国栋B15000

1.实现该表的物理存储。根据以下应用场景,用C语言实现该表的存储,定义出它的结构

(1)如果该信息管理主要功能是查找员工信息,你该如何定义?

(2)实现它如果该公司人员变更比较频繁,你考虑又该如何定义?实现它

2.请输入至少5条记录信息,然后求解如下问题:

(1)求出员工的平均工资,并进行输出

(2)请插入一个员工的信息

(3)请输出所有员工的信息

(4)以上功能用函数实现,尽量使用多文件方式进行组织和管理缺点:


顺序结构完整架构:

头文件(define.h):

#ifndef DEFINE_H_INCLUDED
#define DEFINE_H_INCLUDED

#define MaxSize 50

typedef struct staff
{
    char position[20];
    char number[20];
    char name[20];
    char data[20];
    char level[5];
    int salary;
}ElemType;

typedef struct
{
    ElemType data[MaxSize];
    int length;
}SqList;

void CreateList(SqList *&L,ElemType a[],int n);
int ListInsert(SqList *&L,int i);
int ListEmpty(SqList *L);
void DispList(SqList *L);
void average(SqList *L);


#endif // DEFINE_H_INCLUDED

功能函数文件(define_function.cpp):

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include "define.h"

void CreateList(SqList *&L,ElemType a[],int n)
{
    int i=0,k=0;
    L=(SqList*)malloc(sizeof(SqList));
    while(i<n)
    {
        L->data[k]=a[i];
        k++;
        i++;
    }
    L->length=k;
}

int ListInsert(SqList *&L,int i)
{
    int j;
    if(i<1||i>L->length+1)
    {
        return 0;
    }
    i--;//将顺序表逻辑位序转化为物理位序
    for(j=L->length;j>i;j--)
    {
       L->data[j]=L->data[j-1];
    }
    scanf("%s %s %s %s %s %d",&L->data[i].position,&L->data[i].number,&L->data[i].name,&L->data[i].data,&L->data[i].level,&L->data[i].salary);
    printf("\n");
    L->length++;//顺序表长度增1
}

int ListEmpty(SqList *L)
{
    return(L->length==0);
}

void DispList(SqList *L)
{
    int i;
    if(ListEmpty(L))
    {
        return;
    }
    printf("员工列表为:\n");
    for(i=0;i<L->length;i++)
    {
        printf("%s %s %s %s %s %d",L->data[i].position,L->data[i].number,L->data[i].name,L->data[i].data,L->data[i].level,L->data[i].salary);
        printf("\n");
    }
}

void average(SqList *L)
{
    int i;
    int sum=0;
    int average=0;
    for(i=0;i<L->length;i++)
    {
        sum=sum+L->data[i].salary;
    }
    average=sum/(L->length);
    printf("员工平均工资为:%d",average);
    printf("\n");
}

主函数main()文件(main.cpp):

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include "define.h"



int main()
{
    SqList *L;
    int k;
    struct staff info[5]={
    {"董事长","WL001","表姐","2007/11/19","A5",10000},
    {"总经理","WL002","凌祯","2011/11/1","A4",9000},
    {"董事长秘书","WL003","邹新文","2005/1/31","A3",8500},
    {"秘书","WL004","李明","2012/6/9","B6",7000},
    {"秘书","WL005","翁国栋","2005/10/30","B1",5000},
    };
    CreateList(L,info,5);
    DispList(L);
    average(L);
    printf("请输入插入位置:");
    scanf("%d",&k);
    ListInsert(L,k);
    DispList(L);
}

四、总结

优缺点总结:

顺序存储:相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。

优点:

1、逻辑结构与物理结构是统一的,其中的元素都是顺序存储的;
2、方法简单,好理解,各种语言中都有数组,易实现;
3、不用为结点间的逻辑关系而增加额外的存储空间;
4、表中数据元素可随机存取,顺序表具有按元素序号随机访问的特点;
5、存储密度大,存储密度为1(存储密度是指一个结点中数据元素所占的存储单元和整个结点所占的存储单元之比)。

缺点:

1、做插入、删除操作时,要移动大量元素,因此对很长的顺序表操作效率低,插入和删除操作不方便;
2、要预先分配存储空间,预先估计过大,会导致存储空间浪费,估计过小,会造成数据溢出。


链式存储:相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针

优点:

1、做插入、删除操作时很方便,不需要移动数据元素,动态性强;
2、不用预先估计存储空间的规模。

缺点:

1、链式存储的操作是基于指针的,但不是所有的语言中都有指针类型;
2、对每个数据元素而言,除了自身信息外,还需要一起存放其后继存储单元的地址,这两部分共同组成一个结点;
3、存储密度小,存储密度小于1;
4、表中数据元素不可随机存取。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值