数据结构的顺序表的学习
1、基本概念(如何有效的高效的研究数据的存储)
数据结构是一门研究如何有效组织数据,并提高数据处理效率的学科。通过研究各种数据内部的逻辑关系,使用某种特定的存储形式,并在此基础上对数据实施各种操作,这些工作被称为称为广义上的算法。
- 逻辑结构:线性表,集合,树,图等结构
2、顺序表
- 基本概念:顺序存储的线性表;如果有n个元素,其中一个a元素有且只有一个前驱a-1,有且只有一个后去a+1,首元素没有前驱a0-1,尾元素没有后驱an+1;当中的数据是一个挨着一个的,常被称为一对一关系。反之,如果数据之间的关系不是一对一的,就是非线性的。
-
顺序存储就是将数据存储到一片连续的内存中,在C语言环境下,可以是具名的栈数组,或者是匿名的堆数组。
顺序表的设计:
- 设计一个专门管理顺序表的”管理结构体“,管理结构体中一般会包含:
- 顺序表总容量
- 顺序表当前最末元素下标位置
- 顺序表指针
struct seq{int cap; // 顺序表容量int last; // 最末元素下标int * data; // 顺序表,以整型数据为例};
2.初始化顺序表:
//初始化顺序数据表
struct seq *init_callloc(int cap)
{struct seq *p=calloc(1,sizeof(struct seq));if (p!=NULL){p->cap=cap;p->last=0;p->data=calloc(1,sizeof (int)*cap);if (p->data!=NULL)return p;elsefree(p); }
}
3.增删,遍历,查找节点:
//判断是否为空
bool seq_Empty(struct seq *s)
{return s->last==0;
}
//判断是否已满
bool seq_Full(struct seq *s)
{return s->last==s->cap;
}//查找位置
int seq_find(struct seq *s,int data)
{if (seq_Empty(s)){printf("seq is empty\n");return -1;}for (int i = 0; i < s->last; i++){if (s->data[i]=data){return i;}}
}
//末尾插入数据
void seq_tail(struct seq *s,int data)
{if (seq_Full(s)){printf("seq is full\n");return;}s->data[s->last]=data;s->last++;
}
//开头插入数据
void seq_head(struct seq *s,int data)
{if (seq_Full(s)){printf("seq is full\n");return;}s->data[0]=data;s->last++;
}
//在指定位置插入数据
void seq_middil(struct seq *s,int data)
{int index;for (int i = 0; i < s->last; i++){if (s->data[i]>data){index=i;break;}else{index=i+1;continue;}}for (int i = s->last; i >= index ; i--){ s->data[i+1] = s->data[i];}s->last++;s->data[index] = data;
}//遍历顺序表
void seq_show(struct seq *s)
{if(seq_Empty(s)){printf("Sequence is empty!\n");return;}printf("Sequence list data is:");for (int i = 0; i <= s->last; i++){printf("%d ", s->data[i]);}printf("\n");
}// 移除节点
bool remove_sequenceList(struct seq *s, int index)
{if(index != -1){ // 后面的数据要向前移动while (1){if(index == s->last){s->data[index]=0;s->last--;break;}s->data[index] = s->data[index+1];index++;}return true;}return false;
}
4.销毁顺序表:
//销毁顺序表
void seq_destroy(struct seq *s)
{if (s==NULL)return;free(s->data);free(s);
}
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>struct seq
{int cap;int last;int *data;
};
//初始化顺序数据表
struct seq *init_callloc(int cap)
{struct seq *p=calloc(1,sizeof(struct seq));if (p!=NULL){p->cap=cap;p->last=0;p->data=calloc(1,sizeof (int)*cap);if (p->data!=NULL)return p;elsefree(p); }
}//判断是否为空
bool seq_Empty(struct seq *s)
{return s->last==0;
}
//判断是否已满
bool seq_Full(struct seq *s)
{return s->last==s->cap;
}//查找位置
int seq_find(struct seq *s,int data)
{if (seq_Empty(s)){printf("seq is empty\n");return -1;}for (int i = 0; i < s->last; i++){if (s->data[i]=data){return i;}}
}
//末尾插入数据
void seq_tail(struct seq *s,int data)
{if (seq_Full(s)){printf("seq is full\n");return;}s->data[s->last]=data;s->last++;
}
//开头插入数据
void seq_head(struct seq *s,int data)
{if (seq_Full(s)){printf("seq is full\n");return;}s->data[0]=data;s->last++;
}
//在指定位置插入数据
void seq_middil(struct seq *s,int data)
{int index;for (int i = 0; i < s->last; i++){if (s->data[i]>data){index=i;break;}else{index=i+1;continue;}}for (int i = s->last; i >= index ; i--){ s->data[i+1] = s->data[i];}s->last++;s->data[index] = data;
}//遍历顺序表
void seq_show(struct seq *s)
{if(seq_Empty(s)){printf("Sequence is empty!\n");return;}printf("Sequence list data is:");for (int i = 0; i <= s->last; i++){printf("%d ", s->data[i]);}printf("\n");
}//销毁顺序表
void seq_destroy(struct seq *s)
{if (s==NULL)return;free(s->data);free(s);
}// 移除节点
bool remove_sequenceList(struct seq *s, int index)
{if(index != -1){ // 后面的数据要向前移动while (1){if(index == s->last){s->data[index]=0;s->last--;break;}s->data[index] = s->data[index+1];index++;}return true;}return false;
}
int main(int argc,char *argv[])
{int cap;printf("请输入需要的内存:");scanf("%d",&cap);struct seq *s=init_callloc(cap);int data;while(1){printf("请输入[正整数为插入,负数为删减]:");scanf("%d",&data);if (data>0){if (seq_Empty(s)){seq_tail(s,data);}else if(seq_Full(s)){printf("seq is full\n");continue;}else{seq_middil(s,data);}}else{int index = seq_find(s, -data);remove_sequenceList(s, index);}seq_show(s); }seq_destroy(s);return 0;
}
