顺序存储结构会申请一段连续的内存空间来存储数据,下面详解一下顺序表的各大使用
在此之前必须要了解一个知识点:当传参的时候,如果你需要改变这个参数的数值,则需要传递这个参数变量的地址,当你不需要改变它的数值的时候,只需要传递该参数就行,这个对于非常学习数据结构十分重要。
相关的头文件定义:
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */
首先顺序表的定义,仅仅只需要该表的长度和分配数组大小,这个类似于结构体
typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
typedef int Status; //定义函数的类型
顺序表的初始化(将长度赋值为0)
/* 初始化顺序线性表 */
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
插入数据:插入的位置可以在头,身,尾三个地方,所以要进行判断,当插入到尾部的时候,直接将该数值赋值给data[i-1]便可以,但如果是身或者头,则需要将该插入元素的后面元素依次往后移一位,最后记得将表长+1;
Status ListInsert(SqList *L,int i,ElemType e) //i---插入的位置 e----插入的元素
{
int k;
if(L->length == MAXSIZE)
return ERROR;
if(i<1||i>L->length+1)
return ERROR;
if(i<=L->length)
{
for(k = L->length-1;k>=i-1;k--)
{
L->data[k+1] = L->data[k];
}
}
L->data[i-1] = e;
L->length++;
return OK;
}
删除元素(删除元素实则就是删除元素后,将删除元素后面的元素依次往前移动一位,或者将删除元素前面元素后移一位),因为删除了L表里面的数据(改变了表的数据,则需要传递表的地址)
Status deleteList(SqList *L,int s,ElemType *e) //s---位置
{
int i;
if(s>L->length||s<1)
return 0;
*e = L->data[s-1]; //记录删除的元素
if(s<L->length)
{
for(i = s;i<L->length;i++)
{
L->data[i-1] = L->data[i];
}
}
L->length--;
return OK;
}
当你要删除表尾元素的时候,不需要进行驯悍操作,因为,当表长减1的时候,这个最后一位元素自然会消失,完全不用理会这种情况,只需要考虑当该位置位于表头或者表身的时候的删除情况。
查找元素位置(思路:for循环+判相等)
int findList(SqList L,ElemType e)
{
int i;
if(L.length == 0)
return 0;
for(i = 0;i<L.length;i++)
{
if(L.data[i] == e)
break;
}
return i+1;
}
判断表是否为空
Status Listempty(SqList L)
{
if(L.length == 0)
return TRUE;
else
return FALSE;
}
求表长
int ListLength(SqList L)
{
int i = 0;
while(L.length)
{
++i;
L.length--;
}
return i;
}
合并顺序表
void unionL(SqList *La,SqList Lb)
{
int La_len,Lb_len,i;
ElemType e; /*声明与La和Lb相同的数据元素e*/
La_len=ListLength(*La); /*求线性表的长度 */
Lb_len=ListLength(Lb);
for (i=1;i<=Lb_len;i++)
{
getElem(Lb,i,&e); /*取Lb中第i个数据元素赋给e*/
if (!LocateElem(*La,e)) /*La中不存在和e相同数据元素*/
ListInsert(La,++La_len,e); /*插入*/
}
}
Status getElem(SqList L,int i,ElemType *e)
{
if(L.length==0 || i<1 || i>L.length)
return ERROR;
*e = L.data[i-1];
return OK;
}
int LocateElem(SqList L,ElemType e)
{
int i;
if (L.length==0)
return 0;
for(i=0;i<L.length;i++)
{
if (L.data[i]==e)
break;
}
if(i>=L.length)
return 0;
return i+1;
}
代码运行结构如下: