二 线性表

本文深入探讨线性表的概念,详细介绍了顺序表和链表的结构及操作,包括顺序表的动态分配、单链表的初始化、输出、查找和插入删除等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二 线性表

2.1 顺序表

2.1.1 顺序表的结构体

const int maxn = 1e5+5;
struct SqList{
    int len;
    int data[maxn];
};

2.1.2 顺序表的动态分配

const int maxn = 1e2+5;
struct SeqList{
    int *data;
    int MaxSize,lenght;
};
//L.data = new int[maxn];

2.1.3 基本操作

bool ListInsert(SqList &L, int p, int e) {
    if(p < 0 || p > L.len)
        return false;
    for(int i = L.len; i > p; i--)
        L.data[i] = L.data[i - 1];
    L.data[p] = e;
    L.len++;
    return true;
}

bool ListDelete(SqList &L, int p, int &e) {
    if(p < 0 || p >= L.len)
        return false;
    e = L.data[p];
    for(int i = p; i < L.len - 1; i++)
        L.data[i] = L.data[i + 1];
    L.len--;
    return true;
}

int LocateElem(SqList L, int e) {
    for(int i = 0; i < L.len; i++) 
        if(L.data[i] == e)
            return i;
    return -1;
}

void ListPrint(SqList L) {
    for(int i = 0; i < L.len; i++)
        cout << L.data[i] << " ";
    cout << endl;
}

2.2 单链表

2.2.1 定义

struct Lnode {
    int data;
    Lnode* next;
};
typedef Lnode* LinkList;

2.2.2 初始化

void InitList(LinkList &L) {
    L = new Lnode;
    L->next = NULL;
}

2.2.3 输出

void List_print(LinkList L) {
    Lnode* p = L->next;
    while(p != NULL) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

2.2.4 头插法

LinkList List_HeadInsert(LinkList &L, int n) {
    Lnode *s;
    InitList(L);
    for(int i = 0; i < n; i++) {
        s = new Lnode;
        cin >> (s->data);
        s->next = L->next;
        L->next = s;
    }
    List_print(L);
    return L;
}

2.2.5 尾插法

LinkList List_TailInsert(LinkList &L, int n) {
    InitList(L);
    Lnode *s, *r = L;
    for(int i = 0; i < n; i++) {
        s = new Lnode;
        cin >> (s->data);
        s->next = r->next;
        r->next = s;
        r = s;
    }
    r->next = NULL;
    List_print(L);
    return L;
}

2.2.6 按位置查找

Lnode *GetElem(LinkList L, int p) {
    if(p < 0)
        return NULL;
    if(p == 0)
        return L;
    Lnode* s = L->next;
    p--;
    while(s && p--)
        s = s->next;
    return s;
}

2.2.7 按值查找

Lnode *locateElem(LinkList L, int e) {
    Lnode* s;
    for(s = L->next; s && s->data != e; s = s->next);
    return s;
}

2.2.8 插入元素

bool ListInsert(LinkList &L, int p, int e) {
    Lnode *s = L;
    if(p<=0) return false;
    p--;
    while(p-- && s)
        s = s->next;
    if(!s)
        return false;
    else {
        Lnode *t = new Lnode;
        t->data = e;
        t->next = s->next;
        s->next = t;
        return true;
    }
}

2.2.9 删除元素

bool ListDelete(LinkList &L, int p, int &e) {
    if(p <= 0)
        return false;
    p--;
    Lnode *s = L;
    while(p-- && s)
        s = s->next;
    if(!s || !(s->next))
        return false;
    else {
        Lnode *t = new Lnode;
        t = s->next;
        e = t->data;
        s->next = t->next;
        delete t;
        return true;
    }
}

2.3 双链表

typedef struct Dnode{
    int data;
    Dnode * prior;
    Dnode * next;
}DlinkNode;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值