线性表的顺序表示和实现

/***********************************
线性表的顺序表示和实现
  by Rowandjj
  date 2014/3/27
***********************************/
#include<iostream>
using namespace std;

#define LIST_INIT_SIZE    100//线性表空间的初始分配量
#define LIST_INCREMENT    10//线性表空间的分配增量


#define OK    1//成功状态码
#define TRUE 1 
#define FALSE 0
#define ERROR    2//失败状态码
#define OVERFLOW -1//内存分配失败状态码

typedef int Status;//返回结果,OK或者ERROR
typedef int Bool;
typedef int ElemType;//元素类型
/*线性表动态分配顺序存储结构*/
typedef struct _SQLIST_
{
    ElemType *elem;//存储空间基址
    int length;//当前长度
    int listsize;//当前分配的存储容量
}Sqlist;

/* 操作定义 */
Status InitList_Sq(Sqlist&);//构造一个空的线性表
Status DestroyList_Sq(Sqlist&);//销毁线性表
Status ClearList_Sq(Sqlist&);//将线性表重置为空表
Bool ListEmpty_Sq(Sqlist);//判断是否为空表
int ListLength_Sq(Sqlist);//返回线性表长度
void GetElem_Sq(Sqlist,int,ElemType&);//获取并返回线性表中指定位置的元素(1<=index<=ListLength)
void PriorElem_Sq(Sqlist,ElemType,ElemType&);//返回指定元素的前驱元素,若是第一个元素,则前驱未定义
void NextElem_Sq(Sqlist,ElemType,ElemType&);//返回指定元素的后继,若是最后一个元素,则后继未定义
Status ListInsert_Sq(Sqlist&,int,ElemType);//在指定位置上插入元素
Status ListDelete_Sq(Sqlist&,int,ElemType&);//删除指定位置上的元素
void ListTraverse_Sq(Sqlist);//遍历顺序表

/*具体实现*/
Status DestroyList_Sq(Sqlist &L)
{
    L.length = 0;
    L.listsize = 0;
    free(L.elem);
    L.elem = NULL;
    return OK;
}
Status ClearList_Sq(Sqlist &L)
{
    L.length = 0;
    return OK;
}
Status InitList_Sq(Sqlist &L)
{
    L.elem = (ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
    if(!L.elem)
    {
        exit(OVERFLOW);
    }
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}
void ListTraverse_Sq(Sqlist L)
{
    for(int i = 0; i < L.length; i++)
    {
        cout<<L.elem[i]<<" ";
    }
    cout<<endl;
}
int ListLength_Sq(Sqlist L)
{
    return L.length;
}
Bool ListEmpty_Sq(Sqlist L)
{
    return L.length==0 ? TRUE : FALSE;
}
Status ListInsert_Sq(Sqlist &L,int i,ElemType e)// 1<=i<=length+1 
{
    if(i<1 || i>L.length+1)//参数判断
    {
        return ERROR;
    }
    if(L.length>=L.listsize)//扩容
    {
        ElemType *newbase = (ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
        if(!newbase)
        {
            exit(OVERFLOW);
        }
        L.elem = newbase;
        L.listsize += LIST_INCREMENT;
    }
    //插入
    ElemType* q = &L.elem[i-1];
    for(ElemType* p = &L.elem[L.length-1];p >= q; p--)
    {
        *(p+1) = *p;
    }
    *q = e;
    L.length++;
    return OK;
}
Status ListDelete_Sq(Sqlist &L,int i,ElemType &e)
{
    ElemType *p = &L.elem[i-1];
    e = *p;
    for(++p; p <= &L.elem[L.length-1]; p++)
    {
        *(p-1) = *p;
    }
    L.length--;
    return OK;
}
void PriorElem_Sq(Sqlist L,ElemType e,ElemType& i)
{
    int index = 0;
    while(L.elem[index] != e && index < L.length)
    {
        index++;
    }
    if(index >= L.length || index==0)
    {
        return;
    }
    i = L.elem[index-1];
}
void NextElem_Sq(Sqlist L,ElemType e,ElemType &i)
{
    int index = 0;
    while(L.elem[index]!=e && index<L.length)
    {
        index++;
    }
    if(index>=L.length || index== L.length-1)
    {
        return;
    }
    i = L.elem[index+1];
}    
void GetElem_Sq(Sqlist L,int i,ElemType &e)
{
    if(i<1 || i>L.length)
    {
        return;
    }
    e = L.elem[i-1];
}

测试:

int main()
{
    Sqlist l;
    ElemType e,e2;
    int num,index;

    //init
    InitList_Sq(l);
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    
    //insert
    cin>>num;
    for(int i = 0; i < num; i++)
    {
        cin>>e;
        cin>>index;
        ListInsert_Sq(l,index,e);        
    }
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    //delete
    cin>>index;
    ListDelete_Sq(l,index,e);
    cout<<"e = "<<e<<endl;
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    //get
    cin>>index;
    GetElem_Sq(l,index,e);
    cout<<"e = "<<e<<endl;
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    //get prior
    cin>>e;
    PriorElem_Sq(l,e,e2);
    cout<<"e2 = "<<e2<<endl;
    ListTraverse_Sq(l);
    //get next 
    cin>>e;
    NextElem_Sq(l,e,e2);
    cout<<"e2 = "<<e2<<endl;
    ListTraverse_Sq(l);
    system("pause"); 
    return 0;
}
测试结果:




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
顺序查找算法,也称为线性查找算法,是一种简单直观的查找算法。它的基本思想是从线性表的一端开始,逐个对比查找元素,直到找到目标元素或搜索到线性表的末尾为止。 下面是实现线性表顺序查找算法的示例代码: ```c #include <stdio.h> #define MAXSIZE 100 // 定义线性表最大长度 // 定义线性表结构体 typedef struct { int data[MAXSIZE]; // 存储数据元素 int length; // 线性表长度 } SqList; // 线性表顺序查找算法 int Search_Seq(SqList L, int key) { int i; for (i = 0; i < L.length; i++) { if (L.data[i] == key) { return i; // 查找成功,返回元素下标 } } return -1; // 查找失败,返回-1 } int main() { SqList L = {{1, 3, 5, 7, 9}, 5}; // 初始化线性表 int key = 5; // 要查找的元素值 int result = Search_Seq(L, key); // 进行顺序查找 if (result == -1) { printf("查找失败!\n"); } else { printf("元素%d的位置为%d\n", key, result); } return 0; } ``` 在上面的示例代码中,我们先定义了一个结构体 `SqList` 用来表示线性表,其中包括一个数组 `data` 用来存储数据元素,和一个变量 `length` 表示线性表长度。然后定义了一个函数 `Search_Seq` 用来进行线性表顺序查找,该函数接收两个参数:线性表 `L` 和要查找的元素值 `key`,返回值为目标元素在线性表中的下标,如果查找失败则返回-1。最后在 `main` 函数中初始化了一个线性表 `L`,并进行了一次元素为5的顺序查找。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值