顺序表的存储结构是顺序存储结构,可实现数据元素的随机存取。
一、空间
- 存储空间:预先分配,会导致空间闲置或溢出现象(数组)。
- 存储密度:不用为表示节点间的逻辑关系而增加额外的存储开销,存储密度等于1。
二、时间
- 存取元素:随机存取,按位置(或下标)访问元素的时间复杂度为O(1)。
- 插入、删除:平均运动约表中一半元素,时间复杂度为O(n)。
三、适用情况
- 表长变化不大,且能事先确认变化的范围。
- 很少进行插入或者删除操作,一般用于按元素位置序号访问数据元素。
下面是我自己敲的代码,有错误望指正。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#include <string.h>
#define MAX 100
typedef struct student
{
int number; //学号
char name[16]; //名字
float grade; //成绩
}sqlist;
typedef struct head{
sqlist elem[MAX];
int length;
}list;
void print(); //打印
void initList_Sq(list *L); //初始化
void add_student(list *L); //添加
void always_student(list *L); //全部
void seek_student(list *L); //查找
void signal_student(list *L); //讯号查找
void insert_student(list *L); //插入
void delete_student(list *L); //删除
void count_student(list *L); //统计
void revise_student(list *L); //修改
void over_student(list *L); //结束
int main()
{
list L;
int select;
initList_Sq(&L); //初始化
do
{
print();
scanf("%d", &select);
switch(select)
{
case 1:
add_student(&L);
break;
case 2:
always_student(&L);
break;
case 3:
seek_student(&L);
break;
case 4:
signal_student(&L);
break;
case 5:
insert_student(&L);
break;
case 6:
delete_student(&L);
break;
case 7:
count_student(&L);
break;
case 8:
revise_student(&L);
break;
case 0:
over_student(&L);
break;
}
}
while(select);
return 0;
}
void print()
{
printf("----------------------\n");
printf("--- 请输入功能序号 ---\n");
printf("--- 1 添加 add ---\n");
printf("--- 2 全部 always ---\n");
printf("--- 3 查找 seek ---\n");
printf("--- 4 序号 signal ---\n");
printf("--- 5 插入 insert ---\n");
printf("--- 6 删除 delete ---\n");
printf("--- 7 统计 count ---\n");
printf("--- 8 修改 revise ---\n");
printf("--- 0 退出 over ---\n");
printf("----------------------\n");
}
void initList_Sq(list *L) //初始化
{
L->length = 0;
return;
}
void add_student(list *L) //表尾添加
{
int i, j, num;
printf("-- number of added ---\n"); //多少个同学
scanf("%d", &num);
j = L->length;
for(i = j; i < num + j; i++) //输入添加信息
{
char name[16];
printf("number: %d\n", i+1);
L->elem[i].number = i + 1;
printf("input name\n");
scanf("%s", name);
strcpy(L->elem[i].name, name);
printf("input grade\n");
scanf("%f", &L->elem[i].grade);
}
L->length = j + num;
}
void always_student(list *L) //显示全部
{
int i;
for(i = 0; i < L->length; i++)
{
printf("number: %d\n", L->elem[i].number);
printf(" name: %s\n", L->elem[i].name);
printf(" grade: %.2f\n", L->elem[i].grade);
}
}
void seek_student(list *L) //查找
{
int i, sel, num;
char name[16];
printf("1 number / 2 name\n");
scanf("%d", &sel);
if(sel == 1)
{
printf("input number\n");
scanf("%d", &num);
if(L->elem[num-1].number != 0)
{
printf("number: %d\n", L->elem[num-1].number);
printf(" name: %s\n", L->elem[num-1].name);
printf(" grade: %.2f\n", L->elem[num-1].grade);
}
else
{
printf("haven't student\n");
}
}
if(sel == 2) //错误
{
printf("input name\n");
scanf("%s", name);
for(i = 0; i < L->length; i++)
{
if(strcmp(name, L->elem[i].name) == 0)
{
printf("number: %d\n", L->elem[i].number);
printf(" name: %s\n", L->elem[i].name);
printf(" grade: %.2f\n", L->elem[i].grade);
break;
}
}
}
}
void signal_student(list *L) //讯号查找
{
int num;
printf("input number\n");
scanf("%d", &num);
printf("number: %d\n", L->elem[num-1].number);
printf(" name: %s\n", L->elem[num-1].name);
printf(" grade: %.2f\n", L->elem[num-1].grade);
}
void insert_student(list *L) //插入
{
int i, num;
char name[16];
printf("input insert number\n"); //插入在第几个
scanf("%d", &num);
for(i = L->length; i >= num; i--)
{
L->elem[i].number = L->elem[i-1].number + 1;
strcpy(L->elem[i].name, L->elem[i-1].name);
L->elem[i].grade = L->elem[i-1].grade;
}
L->elem[num-1].number = num;
printf("input name\n");
scanf("%s", name);
strcpy(L->elem[num-1].name, name);
printf("input grade\n");
scanf("%f", &L->elem[num-1].grade);
L->length++;
printf("completes insert\n");
}
void delete_student(list *L) //删除
{
int i, num;
printf("delete number\n");
scanf("%d", &num);
for(i = num-1; i < L->length; i++)
{
L->elem[i].number = L->elem[i+1].number - 1;
strcpy(L->elem[i].name, L->elem[i+1].name);
L->elem[i].grade = L->elem[i+1].grade;
}
L->length--;
}
void count_student(list *L) //统计
{
printf("%d", L->length);
}
void revise_student(list *L) //修改
{
int num, sel;
char name[16];
printf("1 number / 2 name\n");
scanf("%d", &sel);
if(sel == 1)
{
printf("input number\n");
scanf("%d", &num);
printf("originally name\n"); //修改名字
printf("input revise name\n");
scanf("%s", name);
strcpy(L->elem[num-1].name, name);
printf("originally grade\n"); //修改成绩
printf("input revise grade\n");
scanf("%f", &L->elem[num-1].grade);
}
else if(sel == 2)
{
int i;
printf("input name\n");
scanf("%s", name);
for(i = 0; i < L->length; i++)
{
if(strcmp(L->elem[i].name, name) == 0)
{
printf("originally name\n"); //修改名字
printf("input revise name\n");
scanf("%s", name);
strcpy(L->elem[i].name, name);
printf("originally grade\n"); //修改成绩
printf("input revise grade\n");
scanf("%f", &L->elem[i].grade);
}
}
}
else
{
printf("selection error\n"); //输入错误
}
}
void over_student(list *L) //关闭
{
free(L);
exit(0);
}