考研——线性表算法大题整理(一)

一、线性表的存储结构

1. 顺序表

#define MaxSize 100
typedef struct{
    ElemType data[MaxSize];
    // int data[MaxSize];也可以,看题目条件
    int length;
}SqList;

2. 单链表

typedef struct LNode{
    ElemType data;
    // int data; 也可以,看题目条件
    struct LNode* next;
}LNode;

二、顺序表的操作

1. 在顺序表L中查找第一个值为x的元素下标

int find_elem(SqList L, int x)
{
    for (int i = 0; i < L.length; i ++)
        if (L.data[i] == x) return i;
    return -1;
}

2. 在顺序表L下标为pos的位置插入元素x

int insert_elem(SqList &L, int pos, int x)
{
    if (L.length == MaxSize || pos < 0 || pos > L.length)
    	 return 0;	// 注意:pos可以取到0 ~ L.length的每一个位置,
    	            // 取到L.length时跳过循环直接赋值即可
    for (int i = L.length - 1; i >= p; i --)
        L.data[i + 1] = L.data[i];
    L.data[pos] = x;
    (L.length) ++;
    return 1;
}

3. 在顺序表L下标为pos的位置删除元素x

int delete_elem(SqList &L, int pos, int &x)
{
    if (pos < 0 || pos > L.length - 1) return 0;
    x = L.data[pos];
    for (int i = pos + 1; i < L.length; i ++)
        L.data[i - 1] = L.data[i];
    (L.length) --;
    return 1;
}

三、单链表的操作

1. 在单链表L中将值为x的新结点插入到第i个位置

// 默认L是带头结点的单链表
bool insert_elem(LNode* &L, int i, int x)
{
    if (i < 1) return false;
    auto p = L; // p指向第i个元素的前一个位置
    int j = 1;
    while (p && j < i)
    {
        p = p->next;
        j ++;
    }
    if (!p) return false;
    auto s = new LNode(x);
    s->next = p->next;
    p->next = s;
    return true;
}

2. 在单链表L中删除值为x的结点

bool delete_elem(LNode* &L, int x)
{
    auto pre = L, p = L->next;
    while (p)
    {
        if (p->data == x) break;
        p = p->next;
    }
    if (!p) return false;
    else
    {
        pre->next = p->next;
        free(p);
        return true;
    }
}

3. 创建链表

(1) 头插法
LNode* create_list(int a[], int n)
{
    auto dummy = new LNode(-1);	// 虚拟头结点
    dummy->next = NULL;
    for (int i = 0; i < n; i ++)
    {
        auto s = new LNode(a[i]);
        s->next = dummy->next;
        dummy->next = s;
    }
    return dummy;
}
(2) 尾插法
LNode* create_list(int a[], int n)
{
    auto dummy = new LNode(-1); // 虚拟头结点
    auto cur = dummy;
    for (int i = 0; i < n; i ++)
    {
        auto s = new LNode(a[i]);
        cur->next = s;
        cur = cur->next;
    }
    cur->next = NULL;
    return dummy;
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值