线性表的基本操作

1、顺序表的基本操作

using namespace std;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define True 1
#define False 0
#define Ok 1
#define Error 0
#define Infeasible -1
#define Overflow -2
typedef int Status;
typedef int ElemType;


#define ListInitSize 100 //线性表存储空间的初始分配量
#define ListIncrement 10//线性表存储空间的分配增量


//动态申请存储空间的顺序表
typedef struct{//顺序表定义
    ElemType *elem; //指示动态分配数组的指针
    int listsize; //当前分配的存储容量
    int length;//长度
}DynList;

Status DynInitList(DynList &L)//顺序表的初始化
{
    L.elem = (ElemType*)malloc(ListInitSize*sizeof(ElemType));
    if(!L.elem)
        exit(Overflow);
    L.length = 0;
    L.listsize = ListInitSize;
    cout<<"初始化"<<endl;
    return Ok;
}

//在线性表L中第i个位置之前插入新的元素e
Status ListInsert_Sq(DynList &L,int i, ElemType e){
    //第一步:判断数据是否合法
    if(i<1 || i> L.length +1)
        return Error;
    //第二步:判断当前存储空间已满,增加分配
    if(L.length >= L.listsize)
    {
        ElemType *newbase;
        newbase = (ElemType *)realloc(L.elem,
            (L.listsize + ListIncrement)*sizeof(ElemType));
        if(!newbase)
            exit(Overflow);//终结程序
        L.elem = newbase; //新基址
        L.listsize += ListIncrement;//增加存储容量
    }
    //插入元素:
    //1、先找到插入的位置
    //2、将所有的元素向后移动一个单元
    //3、插入元素,表长增1
    int *q,*p;
    q = &(L.elem[i-1]);
    for(p = &(L.elem[L.length-1]);p>=q;--p)
        *(p+1) = *p;
    *q = e;
    ++L.length;
    return Ok;
}

//顺序表的输出
Status ListOutput_Sq(DynList L)
{
    int len = L.length;
    for(int i=0;i<L.length;i++)
    {
        cout<<L.elem[i]<<"\t";
    }
}


//顺序表的查找(按值查找)
Status ListLocate_Sq(DynList L,ElemType e)
{
    int loc=0;
    for(int i=0;i<L.length;i++){
        if(L.elem[i] == e)
            loc = i+1;
    }
    if(loc==0){
        cout<<"没有这个值"<<endl;
    }
    else
        cout<<e<<"是第"<<loc<<"个值"<<endl;
    return loc;
}

//顺序表的删除
Status ListDelete_Sq(DynList &L,int e)
{
    int loc=0;
    loc = ListLocate_Sq(L,e);
    for(int i=loc-1;i<L.length+1;i++){
        L.elem[i] = L.elem[i+1];
    }
    L.length--;
    return Ok;
}

typedef struct Node{//单链表的定义
    ElemType data;
    struct Node *next;
}Node,*LinkedList;

LinkedList LinkedInit()//单链表的初始化
{
    Node *L;
    L = (Node*)malloc(sizeof(Node));
    if(L==NULL)
    {
        cout<<"内存分配失败"<<endl;
    }
    else{
        cout<<"内存分配成功"<<endl;
    }
    L->next =NULL;
    return L;
}


int main()
{
    DynList DynL;
    DynInitList(DynL);
    ListInsert_Sq(DynL,1,1);
    ListInsert_Sq(DynL,1,61);
    ListInsert_Sq(DynL,1,84);
    ListInsert_Sq(DynL,1,52);
    ListInsert_Sq(DynL,1,11);
    ListInsert_Sq(DynL,4,48);
    ListOutput_Sq(DynL);
    ListLocate_Sq(DynL,61);
    ListDelete_Sq(DynL,61);
    ListOutput_Sq(DynL);
    //LinkedInit();
    return 0;
}

结果显示:


15271323-3b9ae8d9b2a45066.png
image.png

补充:


15271323-0dd90d61051d07d0.png
image.png

2、链表


typedef struct Node{//单链表的定义
    ElemType data;
    struct Node *next;
}Node,*LinkedList;

LinkedList LinkedInit()//单链表的初始化
{
    Node *L;
    L = (Node*)malloc(sizeof(Node));
    if(L==NULL)
    {
        cout<<"内存分配失败"<<endl;
    }
    else{
        cout<<"内存分配成功"<<endl;
    }
    L->next =NULL;
    return L;
}

int LinkLength(LinkedList L)//求链表的长度
{
    int len = 0;
    while(L->next)
    {
        len++;
    }
    return len;
}

Status LinkInsert(LinkedList &L,int i,ElemType e)//单链表的插入
{
    /*
    int length = LinkedLength(L);
    if(i>length)
        exit(Overflow);
    */
    Node *pre,*pi;
    pre = L;
    int num = 0;

    while(pre && num < i-1)
    {
        pre = pre->next;
        num++;
    }
    pi = (Node*)malloc(sizeof(Node));
    pi->data = e;
    pi->next = pre->next;
    pre->next = pi;
    return Ok;
}

Status LinkedLocate(LinkedList L,ElemType e)//按值查找
{
    Node *p;
    p = L->next;
    int num=1;
    while(p&&p->data!=e)
    {
        num++;
        p = p->next;
    }
    cout<<e<<"是第"<<num<<"个元素"<<endl;
    return num;
}

Status LinkedDelete(LinkedList L,ElemType e)//链表的删除
{
    int num = LinkedLocate(L,e);
    Node *pre,*pi;
    pre = L;
    int j=0;
    while(pre->next&&j<num-1)
    {
        pre = pre->next;
        j++;
    }
    pi = pre->next;
    pre->next = pi->next;
    free(pi);
    return Ok;
}

Status LinkedOutput(LinkedList L)//链表的输出
{
    Node *p;
    p = L->next;
    while(p)
    {
        cout<<p->data<<"\t";
        p = p->next;
    }
    return Ok;
}

int main()
{
    LinkedList LinkL;
    LinkL = LinkedInit();
    int length = LinkLength(LinkL);
    cout<<"这个链表的长度为:"<<length<<endl;
    LinkInsert(LinkL,0,65);//&是传输,函数里加,调用的时候不加
    LinkInsert(LinkL,0,6);
    LinkInsert(LinkL,0,5);
    LinkInsert(LinkL,0,56);
    LinkedOutput(LinkL);
    LinkedDelete(LinkL,6);
    LinkedOutput(LinkL);
    return 0;
}

结果显示:


15271323-0aeffe7f4bb17b2f.png
image.png

猜你喜欢

转载自blog.csdn.net/weixin_34236869/article/details/87572741
今日推荐