一. 线性表:用来存储类型相同的数据元素的有限集合【数组、生肖、星座】
1>逻辑结构:线性结构【一对一】
2>存储结构:顺序存储、链式存储
线性表:顺序表、链表、栈、队列、字符串、数组
二. 顺序表:线性表的顺序存储
顺序表借助于一维数组实现,但是顺序表不等价于一维数组 seq list
下标从0开始
线性表的长度:顺序表的最大空间,一旦申请,则不会改变
顺序表长度:实际元素的个数,会随着数据元素的增删发生改变
顺序表满,线性表长度==顺序表长度
顺序表空:顺序表len=0;
顺序表结构:数据元素+顺序表长度
作业:
- 顺序表按元素查找
#define dataType int
#define MAXSIZE 8
typedef struct{
dataType data[MAXSIZE];
int len;
}seqlist;
int find_data(seqlist* list,dataType e) {
if(list==NULL||empty_seqlist(list))
{
printf(“查找失败\n”);
return -1;
}
for(int i=0;ilen;i++) {
if(list->data[i]==e) return i;
}
return -1;
}
2. 顺序表按元素删除
int delete_data(seqlist* list,dataType e) {
int res = find_data(list,e);
if(res==-1) {
printf(“删除失败\n”);
return -1;
}
delete_sub(list,res);
}
int delete_sub(seqlist* list,int sub) {
if(list==NULL ||empty_seqlist(list)||sub<0 || sub>=list->len) {
printf(“按下标删除失败”);
return -1;
}
for(int i=sub+1;ilen;i++) {
list->data[i-1]=list->data[i];
}
list->len–;
printf(“按下标删除成功\n”);
return 0;
}
3. 顺序表按元素插入
int insert_data(seqlist* list,dataType e) {
int index = find_data(list,e);
if(index==-1) {
printf(“插入元素失败\n”);
}
insert_sub(list,e,index+1);
return 0;
}
int insert_sub(seqlist* list,dataType e,int sub) {
if(list==NULL||full_seqlist(list)||sub<0||sub>list->len) {
printf(“按下标插入失败\n”);
return -1;
}
for(int i=list->len-1;i>=sub;i–) {
list->data[i+1]=list->data[i];
}
list->data[sub] = e;
list->len++;
printf(“按下标插入成功\n”);
return 0;
}
- 顺序表按元素修改
int update_data(seqlist* list,dataType origin,dataType value) {
int res = find_data(list,origin);
if(res==-1) {
printf(“修改元素失败\n”);
return -1;
}
update_sub(list,value,res);
return 0;
}
int update_sub(seqlist* list,dataType e,int sub) {
if(list==NULL || empty_seqlist(list)||sub<0||sub>=list->len) {
printf(“修改失败!\n”);
return -1;
}
list->data[sub] = e;
printf(“修改成功!\n”);
return 0;
}
5.顺序表排序
int sortSeqlist(seqlist* list) {
for(int i=0;ilen-1;i++) {
for(int j=0;jlen-i-1;j++) {
if(list->data[j]>list->data[j+1]) {
dataType t = list->data[j];
list->data[j]=list->data[j+1];
list->data[j+1]=t;
}
}
}
printf(“排序成功!\n”);
return 0;
}
6.顺序表空间释放
seqlist * freeSpace(seqlist* list) {
if(list==NULL) {
return NULL;
}
free(list);
list=NULL;
return list;
}
7. 顺序表去重
int distinctSeqlist(seqlist* list) {
if(list==NULL||empty_seqlist(list)) {
printf(“去重失败\n”);
return -1;
}
for(int i=0;i< list->len;i++) {
for(int j=i+1;j< list->len;j++) {
if(list->data[i]==list->data[j]) {
delete_sub(list,j);
}
}
}
printf(“去重成功!\n”);
return 0;
}
8.顺序表有序合并
int groupSeqlist(seqlist* list) {
if(list==NULL||empty_seqlist(list)) {
printf(“有序合并失败”);
return -1;
}
int count;
for(int i=0;ilen;i++) {
count=0;
for(int j=0;jlen;j++) {
if(list->data[i]==list->data[j]&&i!=j) {
delete_sub(list,j);
count++;
}
}
for(int i=0;i<count;i++) {
insert_data(list,list->data[i]);
}
}
printf(“合并成功!\n”);
return 0;
}