C+數據結構與算法之順序表

1.定義

線性表的順序存儲稱爲順序表。元素間邏輯關係相鄰,內存地址相鄰;支持隨機訪問,能夠經過下標訪問表中每個元素。
圖片描述算法


2.結構定義

#define MaxSize 50
typedef struct {
int data[MaxSize];
int length;
}Sqlist;

3.相關算法

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;
   }
}
}

4.完整代碼

#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");
}

5.小結

順序表是最基本及簡單的一種數據結構,優勢明顯(隨機訪問,算法簡單)但缺點很突出,不利於內存優化,不利於動態處理,對於一些對內存要求很高的算法以及動態處理很不適用。spa

相關文章
相關標籤/搜索