顺序表的基本操作
- 定义
- 结构体
- 创建一个顺序表
- 展示顺序表数据
- 添加插入
- 随机插入
- 定位
- 删除指定位置的数据
- 合并两个顺序表
1.定义
线性表示将结点沿相同方向(例如:从左向右),按照”一个接一个地排列”的方式组织数据形成的一种数据结构
线性表是n(n>=0)个同类结点的有限序列
线性表在计算机中有两种物理存储结构:顺序存储结构和链存储结构
顺序存储结构特别适合线性表的存储,是计算机中最简单,最常见的一种数据存储方式.这种存储方式利用了存储器的自然特性.只要有足够大小,地址连续的单元构成的一个存储空间区域,就能存储一个完整的线性表.这种存储方式的基本思想是将线性表的结点按它的逻辑结构顺序一个接一个地依次存储,使得在逻辑结构中相邻的结点在存储结构中也是物理相邻的.因此按照这种方式存储的线性表又称为”顺序表”.
2.结构体
创建结构类型,在SequenCs.c文件中
#define M 100
typedef struct sequennode{
int data[M];
int n;
}SEQUENLIST;
3.创建一个顺序表
在SequenList.h写出方法声明
#include <stdio.h>
#include "SequenCs.c"
/*
创建一个顺序表
*/
SEQUENLIST createSequen();
在SequenList.c中实现此方法
#include "SequenList.h"
SEQUENLIST createSequen(){
SEQUENLIST sequen={{20,27,1,3,6,8,9,33,55,28},10};
return sequen;
}
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "SequenList.h"
int main(int argc, const char * argv[]) {
//创建一个顺序表并输出数据元素
printf("创建一个顺序表并且输出\n");
SEQUENLIST cSequen=createSequen();
showSequen(cSequen);
printf("\n");
}
打印结果:
创建一个顺序表并且输出
sequen={{20,27,1,3,6,8,9,33,55,28},10}
4.展示顺序表数据
在SequenList.h写出方法声明
#include <stdio.h>
#include "SequenCs.c"
/*
展示顺序表数据
*/
void showSequen(SEQUENLIST list);
在SequenList.c中实现此方法
#include "SequenList.h"
/*
展示顺序表数据
*/
void showSequen(SEQUENLIST list){
printf("sequen={");
printf("{");
int isFirstPosition=0;
for(int i=0;i<list.n;i++){
if(isFirstPosition==0){
printf("%d",list.data[i]);
isFirstPosition=1;
}else{
printf(",%d",list.data[i]);
}
}
printf("},%d",list.n);
printf("}\n");
}
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "SequenList.h"
int main(int argc, const char * argv[]) {
//创建一个顺序表并输出数据元素
printf("创建一个顺序表并且输出\n");
SEQUENLIST cSequen=createSequen();
showSequen(cSequen);
printf("\n");
}
打印结果:
创建一个顺序表并且输出
sequen={{20,27,1,3,6,8,9,33,55,28},10}
5.添加插入
在SequenList.h写出方法声明
#include <stdio.h>
#include "SequenCs.c"
/*
添加插入:把新结点始终插入到顺序表的尾部(即终点的下一个位置),成为新的结点,顺序表的长度增加1
*/
SEQUENLIST append(SEQUENLIST list,int x);
在SequenList.c中实现此方法
#include "SequenList.h"
SEQUENLIST append(SEQUENLIST list,int x){
//1.判断此时list的数据长度是否大于等于定义时申请的长度M
if(list.n>=M){
printf("overflow!\n");
}else{
//2.list中数据的长度自增+1
list.n++;
//3.将x添加到list的尾部,下角标是n-1
list.data[list.n-1]=x;
printf("append success\n");
}
return list;
}
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "SequenList.h"
int main(int argc, const char * argv[]) {
//添加插入方法
printf("添加插入方法\n");
SEQUENLIST aSequen=createSequen();
showSequen(aSequen);
aSequen=append(aSequen, 100);
showSequen(aSequen);
printf("\n");
}
打印结果:
添加插入方法
sequen={{20,27,1,3,6,8,9,33,55,28},10}
append success
sequen={{20,27,1,3,6,8,9,33,55,28,100},11}
6.随机插入
在SequenList.h写出方法声明
#include <stdio.h>
#include "SequenCs.c"
/*
随机插入:把新结点插入到顺序表的任意指定位置,成为新的结点,顺序表的长度增加1
*/
SEQUENLIST inssl(SEQUENLIST list,int position,int x);
在SequenList.c中实现此方法
#include "SequenList.h"
SEQUENLIST inssl(SEQUENLIST list,int position,int x){
//1.判断此时list的数据长度是否大于等于定义时申请的长度M
if(list.n>=M){
printf("overflow!\n");
}else{
//2.判断插入的位置position是否小于list的数据长度 n
if(position<1 || position>list.n){
printf("插入的位置不存在顺序表中\n");
}else{
//3.将position位置后的数据从最后一个向后移动一个位置
int j=list.n;
while (j>=position) {
list.data[j]=list.data[j-1];
j--;
}
//4.将position的位置插入x
list.data[position-1]=x;
//5.顺序表的数据长度+1
list.n++;
printf("随机插入成功 success\n");
}
}
return list;
}
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "SequenList.h"
int main(int argc, const char * argv[]) {
//随机插入方法
printf("随机插入方法\n");
SEQUENLIST inslSequen=createSequen();
showSequen(inslSequen);
inslSequen=inssl(inslSequen, 5, 88);
showSequen(inslSequen);
printf("\n");
}
打印结果:
随机插入方法
sequen={{20,27,1,3,6,8,9,33,55,28},10}
随机插入成功 success
sequen={{20,27,1,3,88,6,8,9,33,55,28},11}
7.定位
在SequenList.h写出方法声明
#include <stdio.h>
#include "SequenCs.c"
/*
定位:查找顺序表中第一个值为x的位置
*/
int locsl(SEQUENLIST list,int value);
在SequenList.c中实现此方法
#include "SequenList.h"
int locsl(SEQUENLIST list,int value){
int position=0;
while (position+1<=list.n && list.data[position]!=value) {
position++;
};
if(position+1<=list.n){
printf("%d is found ! It is first loction is %d\n",value,position+1);
}else{
printf("%d id not found!\n",value);
}
return position;
}
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "SequenList.h"
int main(int argc, const char * argv[]) {
//定位-查找指定值第一个位置
printf("定位-查找指定值第一个位置\n");
SEQUENLIST locllSequen=createSequen();
showSequen(locllSequen);
locsl(locllSequen, 33);
printf("\n");
}
打印结果:
定位-查找指定值第一个位置
sequen={{20,27,1,3,6,8,9,33,55,28},10}
33 is found ! It is first loction is 8
8.删除指定位置的数据
在SequenList.h写出方法声明
#include <stdio.h>
#include "SequenCs.c"
/*
删除指定位置的数据
*/
SEQUENLIST delsl(SEQUENLIST list,int position);
在SequenList.c中实现此方法
#include "SequenList.h"
SEQUENLIST delsl(SEQUENLIST list,int position){
//1.判断删除的位置是不是在列表中
if(position<1 || position>list.n){
printf("position no in sequen\n");
}else{
//2.将position后面的元素都向前移动一个位置,到最后也把原来列表最后的位置也置为了0
for(;position<=list.n;position++){
list.data[position-1]=list.data[position];
}
//3.list的数据元素的长度 自减-1
list.n--;
printf("delete success\n");
}
return list;
}
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "SequenList.h"
int main(int argc, const char * argv[]) {
//删除指定位置的结点
printf("删除指定位置的结点\n");
SEQUENLIST delSequen=createSequen();
showSequen(delSequen);
delSequen=delsl(delSequen, 3);
showSequen(delSequen);
printf("\n");
}
打印结果:
删除指定位置的结点
sequen={{20,27,1,3,6,8,9,33,55,28},10}
delete success
sequen={{20,27,3,6,8,9,33,55,28},9}
9.合并两个顺序表
在SequenList.h写出方法声明
#include <stdio.h>
#include "SequenCs.c"
/*
合并两个顺序表
*/
SEQUENLIST consl(SEQUENLIST A,SEQUENLIST B);
在SequenList.c中实现此方法
#include "SequenList.h"
SEQUENLIST consl(SEQUENLIST A,SEQUENLIST B){
//1.判断A加上B的元素后,是否超过了定义的申请的空间
if(A.n+B.n>M){
printf("A+B overflow\n");
exit(0);
}
//2.遍历B的数据元素添加到A顺序表后面
for(int j=0;j<B.n;j++){
A.data[A.n+j]=B.data[j];
}
//3.更改A的n
A.n=A.n+B.n;
printf("合并成功\n");
return A;
}
在main.c中的main方法(int main(int argc, const char * argv[]) {})调用此方法,并且进行判断
#include "SequenList.h"
int main(int argc, const char * argv[]) {
//合并两个顺序表
printf("合并两个顺序表\n");
SEQUENLIST A={{1,2,3,4,5,6,7,8,9,10},10};
SEQUENLIST B={{100,101,102,103,104},5};
showSequen(A);
showSequen(B);
A=consl(A, B);
showSequen(A);
printf("\n");
}
打印结果:
合并两个顺序表
sequen={{1,2,3,4,5,6,7,8,9,10},10}
sequen={{100,101,102,103,104},5}
合并成功
sequen={{1,2,3,4,5,6,7,8,9,10,100,101,102,103,104},15}
顺序表操作有缺陷,1.保证连续的存储空间足够大,2.增加和删除效率低.根据实际情况,可以顺序结构和连存储结构结合使用,各区所需
这是对顺序表的基本操作,如有改善的地方,请大家提出,互相学习和进步.如果有好的关于数据结构与算法的书籍,还往大家推荐!