美文网首页
广义表 & 最大子列和改编 & 带头节点链表实现

广义表 & 最大子列和改编 & 带头节点链表实现

作者: zilla | 来源:发表于2019-03-23 15:35 被阅读0次

今天整个心不在焉😢,可能是惦记着今晚羽生的自由滑😭,可能昨天刷了太多张宇视频魔怔了。。。电脑内胆包神奇的不见了,早上电脑包每层拉链搭扣都没合上就背着出门了。。。想撸会儿码定定神出错巨多,昨天才写了4种实现的最大子列和,本来想轻车熟路就一点改编怎么着半小时够了(而且pat可能刷到过了= = ),疯狂出错四五遍。。。甚至赋值左右写反= = WTF。。。状态实在不好放弃了网页上文本编辑器投向clion爸爸的怀抱。。。然后链表合并这么朴素的题目也一直出错= = 虽然不知道这是不是考点,anyway,学了就学了吧= =


广义表

  • 王道在邻接表存储有向图/无向图的弊端和改进提到了其中重要的两种:十字链表(有向图)多重邻接表(无向图),然而讲的不清楚,没想到zju的数据结构mooc在线性表这儿就提了。
参考: zju mooc 2.1 线性表及其实现
广义表:十字链表、多重邻接表等
  • ⚠️多重链表:多重体现在可能有多条链共用某些节点,而非节点中含有多个指针域。
多重链表
参考:b站上王卓老师讲解 十字链表 & 邻接多重表
邻接表弊端 -> 改进的存储结构

最大子列和 —— 输出子列首尾元素

  • 需要注意的点:含0的情况,全负时题目要求输出整个序列的首尾元素, 有并列最大和取前者


    通过率不高是有原因的???
#include <cstdio>

const int INF = 0x3f3f3f3f;

int main() {
    int nn, curr, sum = 0, max_sum = -1, fst;
    scanf("%d", &nn);
    int st = -INF, best_st = -INF, best_ed = -INF, curr_len = 0, len = 0;
    for (int i = 0; i < nn; i++) {
        scanf("%d", &curr);
        if (i == 0) fst = curr;
        if (curr_len == 0 && curr >= 0)
            st = curr;
        sum += curr;
        if (sum < 0) {
            sum = 0, curr_len = 0, st = -INF;
        } else {
            curr_len++;
            if (sum > max_sum) {
                max_sum = sum, len = curr_len;
                best_st = st, best_ed = curr;
            }
        }
    }
    if (len > 0) {
        printf("%d %d %d\n", max_sum, best_st, best_ed);
    } else printf("0 %d %d\n", fst, curr);
    return 0;
}

带头节点的链表实现

  • 题目:将两个有头节点的链表表示的递增整数序列合并为一个非递减的整数序列(zju ds mooc week2作业)

    List S = (List) malloc(sizeof(struct Node)); S->Next = NULL;
  • ⚠️段错误:未给指针分配空间而p->data / 数组越界 / 未检查!empty()就出栈或者出队

  • 指向某类型变量的指针 ptr = (指向某类型变量的指针) malloc(sizeof(某类型变量));

  • 头节点的处理

  • 注意看样例输出: L1->NextL2->Next 置为 NULL

#include <cstdio>
#include <cstdlib>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode Next;
};
typedef PtrToNode List;


List Read() {
    ElementType len, data;
    scanf("%d", &len);
    List list = (List) malloc(sizeof(struct Node));
    list->Next = NULL;
    PtrToNode curr = list;
    for (int i = 0; i < len; ++i) {
        scanf("%d", &data);
        curr->Next = (PtrToNode) malloc(sizeof(struct Node));
        curr = curr->Next;
        curr->Data = data, curr->Next = NULL;
    }
    return list;
}

void Print(List L) {
    PtrToNode curr = L->Next;
    if (curr) {
        while (curr->Next) { // to avoid extra space
            printf("%d ", curr->Data);
            curr = curr->Next;
        }
        printf("%d\n", curr->Data);
    } else puts("NULL");
}

// 将两个链表表示的递增整数序列合并为一个非递减的整数序列
List Merge(List L1, List L2) {
    List final = (List) malloc(sizeof(struct Node)); //caution: with a head node
    PtrToNode curr1 = L1->Next, curr2 = L2->Next, curr = final;
    while (curr1 && curr2) {
        if (curr1->Data <= curr2->Data) {
            curr->Next = curr1;
            curr1 = curr1->Next;
        } else {
            curr->Next = curr2;
            curr2 = curr2->Next;
        }
        if (!final->Next) {
            final->Next = curr->Next;
        }
        curr = curr->Next;
    }
    if (curr1) {
        curr->Next = curr1;
    }
    if (curr2) {
        curr->Next = curr2;
    }
    L1->Next = L2->Next = NULL; //坑到我的地方qaq
    return final;
}


int main() {
    List L1, L2, L;
    L1 = Read();
    L2 = Read();
    L = Merge(L1, L2);
    Print(L);
    Print(L1);
    Print(L2);

    return 0;
}

/* Input:
 * 3
 * 1 3 5
 * 5
 * 2 4 6 8 10
 *
 * Output:
 * 1 2 3 4 5 6 8 10
 * NULL
 * NULL
 */

吃吃饭准备看羽生结弦比赛了!
借用小天使一句话“明けない夜はない。”
冲鸭!!!今天自由滑成绩如何,羽生さまも、わたしも、一生懸命に頑張っていく!!!❤️❤️❤️

相关文章

  • 广义表 & 最大子列和改编 & 带头节点链表实现

    今天整个心不在焉?,可能是惦记着今晚羽生的自由滑?,可能昨天刷了太多张宇视频魔怔了。。。电脑内胆包神奇的不见了,早...

  • 链表

    链表是由单个节点链接而成的。 一个节点有两个内容:data和next 链表分为带头节点的和不带头节点的 特点:链表...

  • 数据结构之线性表

    线性表 #线性表#的存储结构包括: 顺序表 链表 链表的五种形式: 单链表 带头节点:head->next ==N...

  • java实现单向循环链表

    链表图解 带头结点的链表: 不带头结点的链表: 区别 带头结点的链表容易代码实现不带头结点的容易实现循环链表和双向...

  • 线性表存储结构

    数组实现 结构体实现 带头结点的单循环链表 带头结点的双循环链表 带头结点 带头结点的单循环链表和双循环链表 不管...

  • 顺序表与单链表

    接口 顺序表(线性表)实现方式 单链表的节点 单链表的实现

  • 线性表

    1.线性表 1.1 顺序表(顺序存储) 静态分配 动态分配 1.2 单链表 单链表定义 不带头节点的单链表插入操作...

  • 顺序表代码实现

    顺序表数组实现 基本操作,增删查改 顺序表的链表实现 该部分有些混乱,主要原因是在于链表有无头节点和节点从0开始计...

  • 【必知必会】HashMap 面试题

    @[TOC] 1:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。...

  • HashMap 相关面试题及其解答

    Q:HashMap 的数据结构?A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 ...

网友评论

      本文标题:广义表 & 最大子列和改编 & 带头节点链表实现

      本文链接:https://www.haomeiwen.com/subject/zrrsvqtx.html