C語言順序表(資料結構與演算法篇)
阿新 • • 發佈:2021-02-03
順序表是在計算機記憶體中以陣列的形式儲存的線性表,線性表的順序儲存是指用一組地址連續的儲存單元依次儲存線性表中的各個元素、使得線性表中在邏輯結構上相鄰的資料元素儲存在相鄰的物理儲存單元中,即通過資料元素物理儲存的相鄰關係來反映資料元素之間邏輯上的相鄰關係,採用順序儲存結構的線性表通常稱為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的儲存單元中。即順序表的本質可以理解為陣列。
1.順序表的建立以及初始化
#include<stdio.h>
#define MAXSIZE 255//表中元素最大個數
typedef int Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];
int length;//表中元素個數
}SeqList;
int Init_List(SeqList *L)
{
L->length = 0;
}
2.順序表插入元素
插入元素的基本思想就是將待插入元素位置以後的所有元素依次向後移一位,然後將待插元素放入相應的位置,最後元素總個數加一。
int Insert_List(SeqList *L,int l,int x)
{
int i;
if(L->length > MAXSIZE)
{
printf ("插入失敗,表中元素已滿。\n");
return 0;
}
if(l < 0 || l > L->length)
{
printf("插入的位置有誤!\n");
return 0;
}
for(i = L->length;i > l;i--)
{
L->data[i] = L->data[i-1];//表中元素
}
L->data[l] = x;
L->length++;
return 1;
}
3.順序表查詢元素
查詢的方式有很多,折半查詢,雜湊查詢等等,下面示例用順序查詢方式。
·按位置查詢,查詢成功則返回該位置的元素值
Elemtype Find_Locaion(SeqList *L,int l)
{
if(l < 0 || l > L->length)
{
printf("插入的位置有誤!\n");
return 0;
}
return L->data[l];
}
·按元素值查詢,查詢成功則返回該元素的位置
int Find_Elem(SeqList *L,int x)
{
int i;
for(i = 0;i < L->length;i++)
{
if(L->data[i] == x)
return i;
}
return -1;
}
4.順序表刪除元素
刪除元素的思想與插入元素的思想類似,找到待刪除元素的位置,將此元素之後的所有元素依次向前移一位,最後元素總個數減一。
int Del_List(SeqList *L,int x)
{
int l = Find_Elem(L,x);//找到待刪元素的位置
for(int i = l+1;i < L->length;i++)
{
L->data[i-1] = L->data[i];//元素依次向前移一位
}
L->length--;
return 1;
}
5.順序表修改元素
int Modify_List(SeqList *L,int l,int x)
{
if(l < 0 || l > L->length)
{
printf("修改的位置有誤!\n");
return 0;
}
L->data[l] = x;
return 1;
}
完整程式碼實現:
#include<stdio.h>
#define MAXSIZE 255//表中元素最大個數
typedef int Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];
int length;//表中元素個數
}SeqList;
int Init_List(SeqList *L);//初始化順序表
int Insert_List(SeqList *L,int l,int x);//插入元素
Elemtype Find_Locaion(SeqList *L,int l);//按位置查詢
int Find_Elem(SeqList *L,int x);//按元素值查詢
int Empty_List(SeqList *L);//判斷順序表是否為空
int Length_List(SeqList *L);//求表長
int Del_List(SeqList *L,int x);//刪除元素
int Modify_List(SeqList *L,int l,int x);//修改元素
void Print_List(SeqList *L);//遍歷順序表
int Init_List(SeqList *L)
{
L->length = 0;
}
int Insert_List(SeqList *L,int l,int x)
{
int i;
if(L->length > MAXSIZE)
{
printf("插入失敗,表中元素已滿。\n");
return 0;
}
if(l < 0 || l > L->length)
{
printf("插入的位置有誤!\n");
return 0;
}
for(i = L->length;i > l;i--)
{
L->data[i] = L->data[i-1];//表中元素
}
L->data[l] = x;
L->length++;
return 1;
}
Elemtype Find_Locaion(SeqList *L,int l)
{
if(l < 0 || l > L->length)
{
printf("插入的位置有誤!\n");
return 0;
}
return L->data[l];
}
int Empty_List(SeqList *L)
{
if(L->length == 0)
return 1;
else
return 0;
}
int Length_List(SeqList *L)
{
return L->length;
}
int Find_Elem(SeqList *L,int x)
{
int i;
for(i = 0;i < L->length;i++)
{
if(L->data[i] == x)
return i;
}
return -1;
}
int Del_List(SeqList *L,int x)
{
int l = Find_Elem(L,x);//找到待刪元素的位置
for(int i = l+1;i < L->length;i++)
{
L->data[i-1] = L->data[i];//元素依次向前移一位
}
L->length--;
return 1;
}
int Modify_List(SeqList *L,int l,int x)
{
if(l < 0 || l > L->length)
{
printf("修改的位置有誤!\n");
return 0;
}
L->data[l] = x;
return 1;
}
void Print_List(SeqList *L)
{
for(int i = 0;i < L->length;i++)
{
printf("%d\n",L->data[i]);
}
}
int main()
{
SeqList L;
int i;
int k,m;
Init_List(&L);
Insert_List(&L,0,1);
Insert_List(&L,1,2);
Insert_List(&L,2,3);
Insert_List(&L,3,4);
Insert_List(&L,4,5);
k = Empty_List(&L);
m = Length_List(&L);
printf("%d %d\n",k,m);
Print_List(&L);
return 0;
}