数据结构之简单线性表

来源:互联网 发布:免费英语水平测试软件 编辑:程序博客网 时间:2024/05/02 04:46

       线性表是一种基本的数据结构。

       线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。这里我们只讨论顺序存储的线性表。在内存中一连续的一段空间来存储。线性表可以实现在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 100struct 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;}

        希望对大家有所帮助微笑.


0 0