線性表的順序存儲稱爲順序表。元素間邏輯關係相鄰,內存地址相鄰;支持隨機訪問,能夠經過下標訪問表中每個元素。
算法
#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"); }
順序表是最基本及簡單的一種數據結構,優勢明顯(隨機訪問,算法簡單)但缺點很突出,不利於內存優化,不利於動態處理,對於一些對內存要求很高的算法以及動態處理很不適用。spa