线性表是一种基本的数据结构。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。这里我们只讨论顺序存储的线性表。在内存中一连续的一段空间来存储。线性表可以实现在n个连续的空间(即线性
表长度为n)插入,删除,查找,清空等操作。详细用法如下:
1.线性表的定义以及初始化
struct node//定义一个结构体
{
int *elem;
int len; //存线性表长度
};
void InitList(struct node *l)//初始化线性表
{
l->elem=(int *)malloc(sizeof(int)*length);//给结构体里的指针elem开length个interesting型的空间
l->len=0;
}
2.插入函数
void ListInsert(struct node *l,int id,int e)//在指定位置插入某值
{
if(l->len>length)//线性表长度超过length,报错
return Error;
else
{
if(id>l->len)//插入位置大于当前线性表长度,插入线性表末尾
{
l->elem[l->len++]=e;
return ;
}
if(id<1)//插入位置小于1,插入线性表开头
id=1;
int i;
for(i=l->len-1; i>=id-1; i--)//原线性表第id(此时结构体数组下标为id-1)位置及其第id位置以后的数值全部向后移动一项
{
l->elem[i+1]=l->elem[i];
}
l->elem[id-1]=e;
l->len++;
}
}
3.输出函数
void DisplayList(struct node *l)//遍历输出线性表
{
if(l->len<1)
return Error;
int i;
for(i=0; i<l->len; i++)
{
printf("%d ",l->elem[i]);
}
printf("\n");
}
4 .删除函数
void DeleteList(struct node *l,int id)//删除指定位置的元素的值
{
if(id<1||id>l->len)
return ;
int i;
for(i=id-1; i<l->len-1; i++)
{
l->elem[i]=l->elem[i+1];//线性表第id位置(此时结构体数组下标为id-1)后的每项被后一项覆盖,即完成第id项的删除
}
l->len--;//删除一项,线性表长度减少1
}
5.销毁或清空线性表
void DestroyList(struct node *l)//销毁线性表
{
l->len=0;
free(l->elem);//清空结构体数组并释放内存
}
void clearList(struct node *l)//清空线性表
{
l->len=0;
}
6.查找指定位置的值的函数
int GetList(struct node *l,int id)//查找指定位置的值
{
if(id<1||id>l->len)
return Error;
return l->elem[id-1];
}
7.查找已知值在线性表某位置的函数
int LocateList(struct node *l,int e)//查找某值在线性表的位置
{
int i;
for(i=0; i<l->len; i++)
{
if(l->elem[i]==e)
{
return i+1;
}
}
return Error;
}
8.判断线性表是否为空
bool ListEmpty(struct node *l)//判断线性表是否为空
{
if(l->len==0)
return true;
return false;
}
9.返回线性表长度
int ListLength(struct node *l)//返回线性表长度
{
return l->len;
}
10.返回线性表某位置的前驱或后驱元素
int PriorList(struct node *l,int e)//返回线性表非头先驱元素值
{
int i;
for(i=0; i<l->len; i++)
{
if(l->elem[i]==e)
{
if(i>0)
{
return l->elem[i-1];
}
}
}
return Error;
}
int NextList(struct node *l,int e)//返回线性表非尾后驱元素值
{
int i;
for(i=0; i<l->len; i++)
{
if(l->elem[i]==e)
{
if(i<l->len-1)
return l->elem[i+1];
}
}
return Error;
}
完整代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#define Error -10000
#define length 100
struct node//定义一个结构体(数组)
{
int *elem;
int len; //存线性表长度
};
void InitList(struct node *l)//初始化线性表
{
l->elem=(int *)malloc(sizeof(int)*length);//给结构体里的指针elem开length个interesting型的空间
l->len=0;
}
void DestroyList(struct node *l)//销毁线性表
{
l->len=0;
free(l->elem);//清空结构体数组并释放内存
}
void clearList(struct node *l)//清空线性表
{
l->len=0;
}
int GetList(struct node *l,int id)//查找指定位置的值
{
if(id<1||id>l->len)
return Error;
return l->elem[id-1];
}
bool ListEmpty(struct node *l)//判断线性表是否为空
{
if(l->len==0)
return true;
return false;
}
int ListLength(struct node *l)//返回线性表长度
{
return l->len;
}
int LocateList(struct node *l,int e)//查找某值在线性表的位置
{
int i;
for(i=0; i<l->len; i++)
{
if(l->elem[i]==e)
{
return i+1;
}
}
return Error;
}
int PriorList(struct node *l,int e)//返回线性表非头先驱元素值
{
int i;
for(i=0; i<l->len; i++)
{
if(l->elem[i]==e)
{
if(i>0)
{
return l->elem[i-1];
}
}
}
return Error;
}
int NextList(struct node *l,int e)//返回线性表非尾后驱元素值
{
int i;
for(i=0; i<l->len; i++)
{
if(l->elem[i]==e)
{
if(i<l->len-1)
return l->elem[i+1];
}
}
return Error;
}
void ListInsert(struct node *l,int id,int e)//在指定位置插入某值
{
if(l->len>length)//线性表长度超过length,报错
return Error;
else
{
if(id>l->len)//插入位置大于当前线性表长度,插入线性表末尾
{
l->elem[l->len++]=e;
return ;
}
if(id<1)//插入位置小于1,插入线性表开头
id=1;
int i;
for(i=l->len-1; i>=id-1; i--)//原线性表第id(此时结构体数组下标为id-1)位置及其第id位置以后的数值全部向后移动一项
{
l->elem[i+1]=l->elem[i];
}
l->elem[id-1]=e;
l->len++;
}
}
void DeleteList(struct node *l,int id)//删除指定位置的元素的值
{
if(id<1||id>l->len)
return ;
int i;
for(i=id-1; i<l->len-1; i++)
{
l->elem[i]=l->elem[i+1];//线性表第id位置(此时结构体数组下标为id-1)后的每项被后一项覆盖,即完成第id项的删除
}
l->len--;//删除一项,线性表长度减少1
}
void DisplayList(struct node *l)//遍历输出线性表
{
if(l->len<1)
return Error;
int i;
for(i=0; i<l->len; i++)
{
printf("%d ",l->elem[i]);
}
printf("\n");
}
int main()
{
struct node list;
InitList(&list);
// ListInsert(&list,1,3);
// ListInsert(&list,1,2);
// ListInsert(&list,1,1);
// DisplayList(&list);
// DeleteList(&list,3);
// DisplayList(&list);
// DeleteList(&list,2);
// DisplayList(&list);
// DeleteList(&list,1);
// DisplayList(&list);
// DeleteList(&list,-1);
// DisplayList(&list);
return 0;
}
希望对大家有所帮助.