當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 數(shù)據(jù)結(jié)構(gòu)之順序表
什么是順序表?
首先順序表指的是在數(shù)據(jù)結(jié)構(gòu)中的一種線性存儲結(jié)構(gòu),區(qū)別于鏈式表。
其主要借助元素在存儲器中的相對位置來表示數(shù)據(jù)元素間的邏輯關(guān)系。通常存將數(shù)據(jù)儲在一片連續(xù)的空間上,例如數(shù)組。
結(jié)構(gòu)如下圖:
順序表的實現(xiàn):
在C語言中,一維數(shù)組的元素也是存放于一片連續(xù)的存儲空間中,故可借助于C語言中一維數(shù)組類型來描述線性表的順序存儲結(jié)構(gòu)。
頭文件如下:
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdio.h>
#include <stdlib.h>
#define N 10
//順序表結(jié)構(gòu)的定義
//data為數(shù)組,用于存儲數(shù)據(jù)
//last為整形數(shù),用來記錄數(shù)組中后一個元素的下標
typedef struct seqlist
{
int data[N];
int last;
}seqlist_t;
//創(chuàng)建順序表
seqlist_t *seqlistCreate();
//判斷順序表是否未滿
intisFull(seqlist_t *s);
//判斷順序表是否為空
intisEmtpy(seqlist_t *s);
//插入數(shù)據(jù)
intseqlistInesert(seqlist_t *s,intvalue,int offset);
//刪除數(shù)據(jù)
intseqlistDelete(seqlist_t *s,int offset);
//查看順序表
void seqlistShow(seqlist_t *s);
#endif
函數(shù)實現(xiàn)如下:
#include "seqlist.h"
//創(chuàng)建順序表,返回順序表的地址
seqlist_t *seqlistCreate()
{
seqlist_t *s = NULL;
s = (seqlist_t*)malloc(sizeof(seqlist_t));
if(NULL == s)
{
printf("create err,fail to malloc\n");
return NULL;
}
s->last = -1;
return s;
}
//判斷順序表是否未滿,last值為N-1時順序表為滿
intisFull(seqlist_t *s)
{
return s->last == N - 1;
}
//判斷順序表是否為空
intisEmtpy(seqlist_t *s)
{
return s->last == -1;
}
//插入數(shù)據(jù)
//value:插入數(shù)據(jù)
//offset:插入位置
intseqlistInesert(seqlist_t *s,intvalue,int offset)
{
if(isFull(s))//判斷順序表是否為滿
{
printf("insert err,seqlist is full\n");
return -1;
}
if(offset < 0 || offset > s->last + 1)//判斷插入的位置offset是否有誤
{
printf("insert err,err offset\n");
return -1;
}
inti = s->last;//臨時變量i保存last;
while(i>= offset)//移動i所標記的元素,后移動的為offset標記位置的元素
{
s->data[i + 1] = s->data[i];
i--;
}
s->data[offset] = value;
s->last++;//讓last標記新的末尾元素。
return 1;
}
//刪除數(shù)據(jù)
intseqlistDelete(seqlist_t *s,int offset)
{
if(isEmtpy(s))
{
printf("delete err,seqlist is empty\n");
return -1;
}
if(offset < 0 || offset > s->last)
{
printf("delete err,err offset\n");
return -1;
}
int ret = s->data[offset];
while(offset < s->last)
{
s->data[offset] = s->data[offset + 1];
offset++;
}
s->last--;
return ret;
}
//查看順序表
void seqlistShow(seqlist_t *s)
{
inti = 0;
while(i<= s->last)
{
printf("%d ",s->data[i]);
i++;
}
}
主函數(shù)用于測試:
#include "seqlist.h"
intmain()
{
seqlist_t *s = seqlistCreate();
seqlistInesert(s,1,0);
seqlistInesert(s,2,1);
seqlistInesert(s,3,2);
seqlistInesert(s,4,3);
seqlistInesert(s,5,4);
seqlistShow(s);
puts("");
seqlistDelete(s,4);
seqlistShow(s);
puts("");
return 0;
}