一、线性表定义
二、结构体基础
在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 表姐 A5 10000 总经理 WL002 凌祯 A4 9000 董事长秘书 WL003 邹新文 A3 8500 秘书 WL004 李明 B6 7000 秘书 WL005 翁国栋 B1 5000
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、要预先分配存储空间,预先估计过大,会导致存储空间浪费,估计过小,会造成数据溢出。
优点:
1、做插入、删除操作时很方便,不需要移动数据元素,动态性强;
2、不用预先估计存储空间的规模。
缺点:
1、链式存储的操作是基于指针的,但不是所有的语言中都有指针类型;
2、对每个数据元素而言,除了自身信息外,还需要一起存放其后继存储单元的地址,这两部分共同组成一个结点;
3、存储密度小,存储密度小于1;
4、表中数据元素不可随机存取。