数据结构
顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。而在顺序表中有定长顺序表和不定长顺序表,定长顺序表较为简单,即是用数组完成。
在写顺序表的时候,需要对结构体有一定的了解(这里就不做过多的结构体介绍)
定长顺序表
一、创建定长顺序表
之所以叫定长,是因为用数组实现,在使用过程只能使用所定义的长度
#define LISTSIZE 10
typedef struct SqList
{
int data[LISTSIZE]; // 存储数据元素的空间
int length; // 存储当前已有的数据个数
}SqList, * SqListPtr;
二、顺序表所实现的功能(定长)
1.顺序表初始化
void InitList_Sq(SqListPtr sqlist) // 初始化函数
{
if (sqlist == NULL) exit(0);
sqlist->length = 0;
}
2.插入
(1)位置插
int InsertList_Sq_Pos(SqListPtr sqlist, int val, int pos) // 按位置插入
{
if (sqlist == NULL) exit(0);
if (sqlist->length == LISTSIZE) return FALSE;
if (pos < 0 || pos > sqlist->length) return FALSE;
int i = sqlist->length;
while (i > pos)
{
sqlist->data[i] = sqlist->data[i - 1];
i--;
}
sqlist->data[i] = val;
sqlist->length++;
return TRUE;
}
(2)头插
int InsertList_Sq_Head(SqListPtr sqlist, int val) // 头插
{
if(sqlist->length == LISTSIZE)
{
return FALSE;
}
int i = sqlist->length;
for(;i>0;i--)
{
sqlist->data[i] = sqlist->data[i-1];
}
sqlist->data[0] = val;
sqlist->length++;
return TRUE;
}
(3)尾插
int InsertList_Sq_Tail(SqListPtr sqlist, int val) // 尾插
{
if(sqlist->length == LISTSIZE)
{
return FALSE;
}
sqlist->data[sqlist->length] = val;
sqlist->length++;
return TRUE;
}
3.删除
(1)位置删
int DeleteList_Sq_Pos(SqListPtr sqlist, int pos) // 按位置删除
{
if(sqlist == NULL)
{
exit(0);
}
if(pos<0||pos>sqlist->length)
{
return FALSE;
}
int i = pos;
for(;i<sqlist->length;i++)
{
sqlist->data[i] = sqlist->data[i+1];
}
sqlist->length--;
return TRUE;
}
(2)头删
int DeleteList_Sq_Head(SqListPtr sqlist) //头删
{
if(sqlist == NULL)
{
exit(0);
}
int i = 0;
for(;i<sqlist->length;i++)
{
sqlist->data[i] = sqlist->data[i+1];
}
sqlist->length--;
return TRUE;
}
(3)尾删
int DeleteList_Sq_Tail(SqListPtr sqlist) //尾删
{
if(sqlist == NULL)
{
exit(0);
}
sqlist->length--;
return TRUE;
}
4.打印
void ShowList_Sq(SqListPtr sqlist) //打印顺序表
{
if(sqlist == NULL)
{
return ;
}
int i = 0;
for(;i<sqlist->length;i++)
{
printf("%d ",sqlist->data[i]);
}
printf("\n");
}
5.查找顺序表某位置所存储的值
int * FindElem_Pos(SqListPtr sqlist, int pos) //找到该位置所存储的值
{
if(sqlist == NULL)
{
exit(0);
}
if(pos<0||pos>sqlist->length)
{
return NULL;
}
return &sqlist->data[pos];
}
6.清空顺序表
void ClearList_Sq(SqListPtr sqlist) //清空顺序表
{
if(sqlist == NULL)
{
return ;
}
sqlist->length = 0;
}
7.销毁顺序表(因为定长顺序表无法真正销毁,我们用清空的操作近似代替定长顺序表的销毁操作)
void DestroyList_Sq(SqListPtr sqlist) //销毁顺序表
{
if(sqlist == NULL)
{
return ;
}
sqlist->length = 0;
}
8.顺序表冒泡排序(这个功能不是基本功能,是本人多写的)
void SortList_Sq(SqListPtr sqlist) //顺序表冒泡排序
{
if(sqlist == NULL)
{
return ;
}
int i,j;
int tmp;
for(i=0;i<sqlist->length-1;i++)
{
for(j=0;j<sqlist->length-i-1;j++)
{
if(sqlist->data[j]>sqlist->data[j+1])
{
tmp = sqlist->data[j+1];
sqlist->data[j+1] = sqlist->data[j];
sqlist->data[j] = tmp;
}
}
}
}
总代码:
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
#define LISTSIZE 10
typedef struct SqList
{
int data[LISTSIZE]; // 存储数据元素的空间
int length; // 存储当前已有的数据个数
}SqList, * SqListPtr;
void InitList_Sq(SqListPtr sqlist) // 初始化函数
{
if (sqlist == NULL) exit(0);
sqlist->length = 0;
}
int InsertList_Sq_Pos(SqListPtr sqlist, int val, int pos) // 按位置插入
{
if (sqlist == NULL) exit(0);
if (sqlist->length == LISTSIZE) return FALSE;
if (pos < 0 || pos > sqlist->length) return FALSE;
int i = sqlist->length;
while (i > pos)
{
sqlist->data[i] = sqlist->data[i - 1];
i--;
}
sqlist->data[i] = val;
sqlist->length++;
return TRUE;
}
int InsertList_Sq_Head(SqListPtr sqlist, int val) // 头插
{
if(sqlist->length == LISTSIZE)
{
return FALSE;
}
int i = sqlist->length;
for(;i>0;i--)
{
sqlist->data[i] = sqlist->data[i-1];
}
sqlist->data[0] = val;
sqlist->length++;
return TRUE;
}
int InsertList_Sq_Tail(SqListPtr sqlist, int val) // 尾插
{
if(sqlist->length == LISTSIZE)
{
return FALSE;
}
sqlist->data[sqlist->length] = val;
sqlist->length++;
return TRUE;
}
int DeleteList_Sq_Pos(SqListPtr sqlist, int pos) // 按位置删除
{
if(sqlist == NULL)
{
exit(0);
}
if(pos<0||pos>sqlist->length)
{
return FALSE;
}
int i = pos;
for(;i<sqlist->length;i++)
{
sqlist->data[i] = sqlist->data[i+1];
}
sqlist->length--;
return TRUE;
}
int DeleteList_Sq_Head(SqListPtr sqlist) //头删
{
if(sqlist == NULL)
{
exit(0);
}
int i = 0;
for(;i<sqlist->length;i++)
{
sqlist->data[i] = sqlist->data[i+1];
}
sqlist->length--;
return TRUE;
}
int DeleteList_Sq_Tail(SqListPtr sqlist) //尾删
{
if(sqlist == NULL)
{
exit(0);
}
sqlist->length--;
return TRUE;
}
int * FindElem_Pos(SqListPtr sqlist, int pos) //找到该位置所存储的值
{
if(sqlist == NULL)
{
exit(0);
}
if(pos<0||pos>sqlist->length)
{
return NULL;
}
return &sqlist->data[pos];
}
void ShowList_Sq(SqListPtr sqlist) //打印顺序表
{
if(sqlist == NULL)
{
return ;
}
int i = 0;
for(;i<sqlist->length;i++)
{
printf("%d ",sqlist->data[i]);
}
printf("\n");
}
void ClearList_Sq(SqListPtr sqlist) //清空顺序表
{
if(sqlist == NULL)
{
return ;
}
sqlist->length = 0;
}
void DestroyList_Sq(SqListPtr sqlist) //销毁顺序表
{
if(sqlist == NULL)
{
return ;
}
sqlist->length = 0;
}
void SortList_Sq(SqListPtr sqlist) //顺序表冒泡排序
{
if(sqlist == NULL)
{
return ;
}
int i,j;
int tmp;
for(i=0;i<sqlist->length-1;i++)
{
for(j=0;j<sqlist->length-i-1;j++)
{
if(sqlist->data[j]>sqlist->data[j+1])
{
tmp = sqlist->data[j+1];
sqlist->data[j+1] = sqlist->data[j];
sqlist->data[j] = tmp;
}
}
}
}
int main()
{
/*以下为测试内容!!!!!!!!!!!!!*/
SqList sq; //定义定长顺序表
InitList_Sq(&sq); //初始化定长顺序表
for(int i=8;i>0;i--) //定长顺序表赋值
{
InsertList_Sq_Tail(&sq,i);
}
ShowList_Sq(&sq); //打印定长顺序表
InsertList_Sq_Head(&sq,50); //头插
InsertList_Sq_Pos(&sq,40,3); //位置插
ShowList_Sq(&sq); //打印定长顺序表
DeleteList_Sq_Pos(&sq,3); //位置删
DeleteList_Sq_Head(&sq); //头删
DeleteList_Sq_Tail(&sq); //尾删
ShowList_Sq(&sq); //打印定长顺序表
printf("%d\n",*(FindElem_Pos(&sq,3))); //找到该位置所存储的值
SortList_Sq(&sq); //定长顺序表冒泡排序
ShowList_Sq(&sq); //打印定长顺序表
ClearList_Sq(&sq); //清空定长顺序表
ShowList_Sq(&sq); //打印定长顺序表
return 0;
}