线性表(顺序存储,链式存储)(带头结点的链表,不带头结点的链表)

本文介绍了线性表的基本操作,包括初始化、查找、插入和删除,并分别给出了顺序存储和链式存储两种实现方式。顺序存储使用数组实现,链式存储分为不带头结点和带头结点的链表实现。每个实现都包含详细的代码示例,展示了如何在指定位置插入和删除元素,以及查找指定元素和获取线性表的长度。
摘要由CSDN通过智能技术生成

 
    线性表的基本操作:
    List MakeEmpty(): 初始化一个新的空线性表;
    ElementType FindKth(List L,int i): 给定指定的位序,返回L中相应的元素ai;
    Position Find(List L,ElementType X) :已知X,返回线性表L中与X相同的第一个元素
        的位置,若不存在则返回错误信息;
    bool Insert(List L,ElementType X,int i):在L的指定位序i前插入一个元素X,成功则返回true,
        否则返回false;
    bool Delect(List L,int i):从L中删除指定位序i的元素,成功则返回true,否则返回false;
    bool Length(List L):返回线性表L的长度;

 

/**
    1)线性表的顺序存储实现:
*/

/**
    线性表的基本操作:
    List MakeEmpty(): 初始化一个新的空线性表;
    ElementType FindKth(List L,int i): 给定指定的位序,返回L中相应的元素ai;
    Position Find(List L,ElementType X) :已知X,返回线性表L中与X相同的第一个元素
        的位置,若不存在则返回错误信息;
    bool Insert(List L,ElementType X,int i):在L的指定位序i前插入一个元素X,成功则返回true,
        否则返回false;
    bool Delect(List L,int i):从L中删除指定位序i的元素,成功则返回true,否则返回false;
    bool Length(List L):返回线性表L的长度;
*/

/**
    1)线性表的顺序存储实现:
*/

/**
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

#define error -1
const int MAXSIZE = 100;
typedef int ElementType;
typedef int Position;
typedef struct LNode * PtrToLNode;
//  这里的位置就是数组的整型下标,从0开始,前面提到的位序是指第几个,从1开始
struct LNode
{
    ElementType Data[MAXSIZE];
    Position Last;
};
typedef PtrToLNode List;

List MakeEmpty();
ElementType FindKth(List L,int i);
Position Find(List L,ElementType X);
bool Insert(List L,ElementType X,int i);
bool Delect(List L,int i);
int Length(List L);
int main()
{
    List L=MakeEmpty();
    for(int i=1;i<15;++i)
        Insert(L,i,i);
    cout << "Insert:\n";
    for(int i=0;i<=L->Last;++i)
        cout << L->Data[i] << ' ';
    cout << endl;
    int K=20;
    if(FindKth(L,K)!=error)
    {
    printf("\n第%d号位找到了:\n",K);
    cout << "此元素为 " << FindKth(L,K) << endl;
    }
    else
        printf("\n该线性表不存在第%d号位的元素\n",K);
    printf("该线性表的元素个数为%d个\n",Length(L));
    for(int i=5;i<10;++i)
        Delect(L,i);
    cout << "Insert:\n";
    for(int i=0;i<=L->Last;++i)
        cout << L->Data[i] << ' ';

    K=5;
    if(FindKth(L,K)!=error)
    {
        printf("\n第%d号位找到了:\n",K);
        cout << "此元素为 " << FindKth(L,K) << endl;
    }
    else
        printf("该线性表不存在第%d的元素\n",K);

    printf("该线性表的元素个数为%d个\n",Length(L));
    return 0;
}

List MakeEmpty()
{
    List L;
    L=(List) malloc(sizeof(LNode));
    L->Last=-1;
    return L;
}
ElementType FindKth(List L,int i)
{
    if(i<1||i>L->Last)
    {
        printf("不存在第%d号位的元素\n",i);
        return error;
    }
    else
        return L->Data[i-1];
}

Position Find(List L,ElementType X)
{
    Position i=0;
    while(i<L->Last&&L->Data[i]!=X)
        ++i;
    if(i>=L->Last)
        return error;
    else
        return i;
}

bool Insert(List L,ElementType X,int i)
{
    if(L->Last==MAXSIZE-1)
    {
        printf("表满\n");
        return false;
    }

    if(i<1||i>L->Last+2)
    {
        printf("位序不合法\n");
        return false;
    }

    for(Position j=L->Last;j>=i-1;--j)
        L->Data[j+1]=L->Data[j];
    L->Data[i-1]=X;
    ++L->Last;
    return true;
}
bool Delect(List L,int i)
{
    if(L->Last<0)
    {
        printf("表空\n");
        return false;
    }
    if(i<1||i>L->Last+1)
    {
        printf("位序%d不存在元素\n",i);
        return false;
    }
    for(Position j=i;j<=L->Last;++j)
        L->Data[j-1]=L->Data[j];
    --L->Last;
    return true;
}

int Length(List L)
{
    return L->Last+1;
}
*/

 2)线性表的链式存储实现

    不带头结点的链表创建,插入,删除

/**
    2)线性表的链式存储实现

    不带头结点的链表创建,插入,删除
*/


#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

#define error NULL
const int MAXSIZE = 100;
typedef int ElementType;
const ElementType inf=1e9;
typedef struct LNode * PtrToLNode;
//  这里的位置就是数组的整型下标,从0开始,前面提到的位序是指第几个,从1开始
struct LNode
{
    ElementType data;
    PtrToLNode next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

List MakeEmpty();
ElementType FindKth(List L,int i);
Position Find(List L,ElementType X);
List Insert(List L,ElementType X,int i);
List Delect(List L,int i);
int Length(List L);

int main()
{
    List L=MakeEmpty();
    for(auto p=L;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    for(int i=1;i<15;++i)
    {
        auto tem=Insert(L,i,i);
        if(tem!=error)
            L=tem;
    }
    cout << "insert:\n";
    for(auto p=L;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    printf("该线性表的元素个数为%d个\n",Length(L));

    int K=20;
    if(FindKth(L,K)!=inf)
    {
        printf("\n第%d号位找到了:\n",K);
        cout << "此元素为 " << FindKth(L,K) << endl;
    }
    else
        printf("\n该线性表不存在第%d号位的元素\n",K);

    K=5;
    if(FindKth(L,K)!=inf)
    {
        printf("\n第%d号位找到了:\n",K);
        cout << "此元素为 " << FindKth(L,K) << endl;
    }
    else
        printf("该线性表不存在第%d的元素\n",K);

    printf("该线性表的元素个数为%d个\n",Length(L));

    for(int i=5;i<10;++i)
    {
        auto tem=Delect(L,i);
        if(tem!=error)
            L=tem;
    }
    cout << "delect:\n";
    for(auto p=L;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    printf("该线性表的元素个数为%d个\n",Length(L));

    auto tem=Delect(L,1);
    if(tem!=error)
        L=tem;
    cout << "delect first node:\n";
    for(auto p=L;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    printf("该线性表的元素个数为%d个\n",Length(L));

    return 0;
}

//不带头结点的链表创建:
List MakeEmpty()
{
    List L;
    L=(List) malloc(sizeof(LNode));
    L=NULL;
    return L;
}

ElementType FindKth(List L,int i)
{
    Position p;
    int cnt=1;
    p=L;
    while(p&&cnt<i)
    {
        p=p->next;
        ++cnt;
    }
    if(p&&cnt==i)
        return p->data;
    else
        return inf;
}

Position Find(List L,ElementType X)
{
    Position p=L;
    while(p&&p->data!=X)
        p=p->next;
    if(!p)
        return error;
    else
        return p;
}

List Insert(List L,ElementType X,int i)
{
    Position pre,tem;
    tem=(Position) malloc(sizeof (LNode));
    tem->data=X;
    if(i==1)
    {
        tem->next=L;
        return tem;
    }
    else
    {
        int cnt=1;
        pre=L;
        while(pre&&cnt<i-1)
        {
            pre=pre->next;
            ++cnt;
        }

        if(pre==NULL||cnt!=i-1)
        {
            printf("参入位置参数错误\n");
            free(tem);
            return error;
        }
        else
        {
            tem->next=pre->next;
            pre->next=tem;
            return L;
        }
    }
}

List Delect(List L,int i)
{
    Position pre=L,tem;
    if(i==1)
    {
        pre=L;
        tem=pre->next;
        free(pre);
        return tem;
    }
    else
    {
        int cnt=1;
        while(pre&&cnt<i-1)
        {
            pre=pre->next;
            ++cnt;
        }

        if(pre==NULL||cnt!=i-1)
        {
            printf("参入位置参数错误\n");
            free(tem);
            return error;
        }
        else
        {
            tem=pre->next;
            pre->next=tem->next;
            free(tem);
            return L;
        }
    }
}

int Length(List L)
{
    Position p=L;
    int len=0;
    while(p)
    {
        p=p->next;
        ++len;
    }
    return len;
}

3)线性表的链式存储实现

    带头结点的链表创建,插入,删除

/**
    3)线性表的链式存储实现

    带头结点的链表创建,插入,删除
*/
/**
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

#define error NULL
const int MAXSIZE = 100;
typedef int ElementType;
const ElementType inf=1e9;
typedef struct LNode * PtrToLNode;
//  这里的位置就是数组的整型下标,从0开始,前面提到的位序是指第几个,从1开始
struct LNode
{
    ElementType data;
    PtrToLNode next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

List MakeEmpty();
ElementType FindKth(List L,int i);
Position Find(List L,ElementType X);
bool Insert(List L,ElementType X,int i);
bool Delect(List L,int i);
int Length(List L);

int main()
{
    List L=MakeEmpty();
    for(auto p=L->next;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    for(int i=1;i<15;++i)
        Insert(L,i,i);
    cout << "insert:\n";
    for(auto p=L->next;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    printf("该线性表的元素个数为%d个\n",Length(L));

    int K=20;
    if(FindKth(L,K)!=inf)
    {
        printf("\n第%d号位找到了:\n",K);
        cout << "此元素为 " << FindKth(L,K) << endl;
    }
    else
        printf("\n该线性表不存在第%d号位的元素\n",K);

    K=5;
    if(FindKth(L,K)!=inf)
    {
        printf("\n第%d号位找到了:\n",K);
        cout << "此元素为 " << FindKth(L,K) << endl;
    }
    else
        printf("该线性表不存在第%d的元素\n",K);

    printf("该线性表的元素个数为%d个\n",Length(L));

    for(int i=5;i<10;++i)
        Delect(L,i);
    cout << "delect:\n";
    for(auto p=L->next;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    printf("该线性表的元素个数为%d个\n",Length(L));

    Delect(L,1);
    cout << "delect first node:\n";
    for(auto p=L->next;p;p=p->next)
        cout << p->data << ' ' ;
    cout << endl;
    printf("该线性表的元素个数为%d个\n",Length(L));
}

 //带头结点的链表创建:
List MakeEmpty()
{
    List L;
    L=(List) malloc(sizeof(LNode));
    L->next=NULL;
    return L;
}

ElementType FindKth(List L,int i)
{
    Position p;
    int cnt=1;
    p=L->next;
    while(p&&cnt<i)
    {
        p=p->next;
        ++cnt;
    }
    if(p&&cnt==i)
        return p->data;
    else
        return inf;
}

Position Find(List L,ElementType X)
{
    Position p=L->next;
    while(p&&p->data!=X)
        p=p->next;
    if(!p)
        return error;
    else
        return p;
}

bool Insert(List L,ElementType X,int i)
{
    Position pre,tem;
    int cnt=1;
    pre=L;
    while(pre&&cnt<i)
    {
        pre=pre->next;
        ++cnt;
    }

    if(pre==NULL||cnt!=i)
    {
        printf("插入位置参数错误\n");
        return false;
    }
    else
    {
        tem=(Position) malloc(sizeof (LNode));
        tem->data=X;
        tem->next=pre->next;
        pre->next=tem;
        return true;
    }
}

bool Delect(List L,int i)
{
    Position pre=L,tem;
    int cnt=1;
    while(pre&&cnt<i)
    {
        pre=pre->next;
        ++cnt;
    }

    if(pre==NULL||cnt!=i||pre->next==NULL)
    {
        printf("参入位置参数错误\n");
        return false;
    }
    else
    {
        tem=pre->next;
        pre->next=tem->next;
        free(tem);
        return true;
    }
}

int Length(List L)
{
    Position p=L->next;
    int len=0;
    while(p)
    {
        p=p->next;
        ++len;
    }
    return len;
}
*/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值