燕返 2019-06-30
线性表的顺序存储称为顺序表。元素间逻辑关系相邻,内存地址相邻;支持随机访问,可以通过下标访问表中每一个元素。
#define MaxSize 50 typedef struct { int data[MaxSize]; int length; }Sqlist;
1)顺序表创建
void creat(Sqlist &L) { int a; printf("线性表元素总数:\n"); scanf("%d",&a); printf("依次输入每个元素\n"); for(int i=0;i<a;i++) { scanf("%d",&L.data[i]); L.length++; } }
2)指定位置插入元素
int insert(Sqlist &L,int i , int e){//在某个位置插入一个元素(成功返回1,失败返回0) if(i<1||i>L.length+1)//如果插入位置小于1或者大于表长+1,则位置不合法 return 0; else if(i>=MaxSize)//如果位置大于等于最大表长,则不可插入 return 0; else if (i== L.length+1) { L.data[L.length] = e; L.length ++; return 1; } else { for(int j = L.length;j>=i;j--)//将插入位置后的所有元素后移 { L.data[j]=L.data[j-1];//这里需注意,数组下标是从0开始的 L.data[i-1] = e; } L.length++;//表长+1 return 1; } }
3)删除指定位置元素
int listdelete(Sqlist &L, int i , int &e){//成功返回1失败返回0 if(i<1||i>L.length)//如果删除位置小于1或者大于表长,则位置不合法 return 0; e = L.data[i-1]; for(int j = i; j<L.length; j++)//删除位之后所有元素前移 L.data[j-1] = L.data[j]; L.length--;//表长-1 return 1; }
4)按值查找
int find(Sqlist L,int e){ int i; for (i = 0; i < L.length; i++) { if(e==L.data[i]) { return i+1; } else { return 0; } } }
#include <stdio.h> #include <stdlib.h> //顺序表定义 #define MaxSize 50 typedef struct { int data[MaxSize]; int length; }Sqlist; //先声明函数 void creat(Sqlist &L);//建立线性表 void show(Sqlist L);//显示线性表 //在指定位置插入数据 int insert(Sqlist &L,int i , int e){//在某个位置插入一个元素(成功返回1,失败返回0) if(i<1||i>L.length+1)//如果插入位置小于1或者大于表长+1,则位置不合法 return 0; else if(i>=MaxSize)//如果位置大于等于最大表长,则不可插入 return 0; else if (i== L.length+1) { L.data[L.length] = e; L.length ++; return 1; } else { for(int j = L.length;j>=i;j--)//将插入位置后的所有元素后移 { L.data[j]=L.data[j-1];//这里需注意,数组下标是从0开始的 L.data[i-1] = e; } L.length++;//表长+1 return 1; } } //删除指定位置元素 int listdelete(Sqlist &L, int i , int &e){//成功返回1失败返回0 if(i<1||i>L.length)//如果删除位置小于1或者大于表长,则位置不合法 return 0; e = L.data[i-1]; for(int j = i; j<L.length; j++)//删除位之后所有元素前移 L.data[j-1] = L.data[j]; L.length--;//表长-1 return 1; } //按值查找成功返回位序,失败返回0 int find(Sqlist L,int e){ int i; for (i = 0; i < L.length; i++) { if(e==L.data[i]) { return i+1; } else { return 0; } } } int main() { Sqlist L; L.length=0;//初始化线性表 creat(L);//创建线性表 /* printf("在顺序表哪个位置插入元素:\n"); int i,e; scanf("%d",&i); printf("插入元素值:\n"); scanf("%d",&e); int j = insert(L,i,e); if(j == 1) { printf("插入成功\n"); show(L);//打印线性表元素 } else { printf("插入失败\n"); } printf("删除第几个位置的数\n"); int h,k; scanf("%d",&h); int temp = listdelete(L, h , k); if(temp == 1) { printf("成功\n"); show(L);//打印线性表元素 } else { printf("失败\n"); } */ //按值查找 int e,temp; printf("想查找的值:\n"); scanf("%d",&e); temp = find(L,e); if (temp == 0) { printf("失败\n"); } else { printf("成功\n"); printf("该元素位序为%d\n",temp); } return 0; } //创建 void creat(Sqlist &L) { int a; printf("线性表元素总数:\n"); scanf("%d",&a); printf("依次输入每个元素\n"); for(int i=0;i<a;i++) { scanf("%d",&L.data[i]); L.length++; } } //打印 void show(Sqlist L) { int i; printf("当前元素:\n"); for(i=0;i<L.length;i++) printf("%d\t",L.data[i]); printf("\n"); }
顺序表是最基本及简单的一种数据结构,优点明显(随机访问,算法简单)但缺点很突出,不利于内存优化,不利于动态处理,对于一些对内存要求很高的算法以及动态处理很不适用。