什么是順序表?
首先順序表指的是在數據結構中的一種線性存儲結構,區別于鏈式表。
其主要借助元素在存儲器中的相對位置來表示數據元素間的邏輯關系。通常存將數據儲在一片連續的空間上,例如數組。
結構如下圖:
順序表的實現:
在C語言中,一維數組的元素也是存放于一片連續的存儲空間中,故可借助于C語言中一維數組類型來描述線性表的順序存儲結構。
頭文件如下:
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdio.h>
#include <stdlib.h>
#define N 10
//順序表結構的定義
//data為數組,用于存儲數據
//last為整形數,用來記錄數組中后一個元素的下標
typedef struct seqlist
{
int data[N];
int last;
}seqlist_t;
//創建順序表
seqlist_t *seqlistCreate();
//判斷順序表是否未滿
intisFull(seqlist_t *s);
//判斷順序表是否為空
intisEmtpy(seqlist_t *s);
//插入數據
intseqlistInesert(seqlist_t *s,intvalue,int offset);
//刪除數據
intseqlistDelete(seqlist_t *s,int offset);
//查看順序表
void seqlistShow(seqlist_t *s);
#endif
函數實現如下:
#include "seqlist.h"
//創建順序表,返回順序表的地址
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;
}
//插入數據
//value:插入數據
//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;
}
//刪除數據
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++;
}
}
主函數用于測試:
#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;
}