icoding复习1,2

icoding复习 1
链表 倒数查找

1. 已知一个带有表头结点的单链表, 假设链表只给出了头指针L。在不改变链表的前提下,请设计一个尽可能高效的算法,
查找链表中倒数第k个位置上的结点(k为正整数)。
函数原型为:int lnk_search(LinkList L, int k, ElemType* p_ele)
若查找成功,函数通过指针参数 p_ele 返回该结点 data 域的值,此时函数返回 1;否则,函数返回 0。相关定义如下:

struct _lnklist{
    ElemType data;
    struct _lnklist *next;
};

typedef struct _lnklist Node;
typedef struct _lnklist *LinkList;

#include
#include
#include "list.h" // 请不要删除,否则检查不通过

int lnk_search(LinkList L, int k, ElemType* p_ele){
    int i, length;
    Node *p;
    
    
    for(i = 0, p = L; p; i++)
        p = p->next;
        
    length = i;
    if(length == 0 || length < k)    return 0;
    
    for(i = 0, p = L; i <= length - k; i++)//!!取等,注意边界 
        p = p->next;
        
    *p_ele = p->data;
    
     return 1;
}


2. 链表 合并

设线性表A=(a1, a2,…,am),B=(b1, b2,…,bn),试写一个按下列规则合并A、B为线性表C的算法,使得:
C= (a1, b1,…,am, bm, bm+1, …,bn) 当m≤n时;
或者
C= (a1, b1,…,an, bn, an+1, …,am) 当m>n时。
线性表A、B、C均以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。
注意:单链表的长度值m和n均未显式存储。
函数的原型如下:
void lnk_merge(LinkList A, LinkList B, LinkList C)
即将A和B合并为C,其中 C 已经被初始化为空单链表
相关定义如下:
//注意:线性表可以是链表 
struct _lnklist{
    ElemType data;
    struct _lnklist *next;
};

typedef struct _lnklist Node;
typedef struct _lnklist *LinkList;
#include
#include
#include "list.h" // 请不要删除,否则检查不通过

void lnk_merge(LinkList A, LinkList B, LinkList C){
    Node *p, *q, *c;
    bool flag = true;//小写!python大写首字母 不用包含bool头文件 
    
    c = C;//c尾指针 
    p = A->next;
    q = B->next;
    
    while(p && q){
        if(flag){
            c->next = p;
            c = p;
            p = p->next;
            flag = false;
        } 
        else{
            c->next = q;
            c = q;
            q = q->next;
            flag = true;
        }
    }
    
    if(p)
        c->next = p;
    else
        c->next = q;
        
    free(A);
    free(B);//!!
}


3. 顺序表 删除指定范围
设计一个高效的算法,从顺序表L中删除所有值介于x和y之间(包括x和y)的所有元素(假设y>=x),
要求时间复杂度为O(n),空间复杂度为O(1)。
函数原型如下:
void del_x2y(SeqList *L, ElemType x, ElemType y);
相关定义如下:

struct _seqlist{
    ElemType elem[MAXSIZE];
    int last;
};
typedef struct _seqlist SeqList;


#include "list.h" // 请不要删除,否则检查不通过
#include
#include

void del_x2y(SeqList *L, ElemType x, ElemType y){
    int i, j = 0;
     
    for(i = 0; i < L->last; i++){
        if(L->elem[i] < x || L->elem[i] > y)
            L->elem[j++] = L->elem[i];    

    L->last = j - 1;//不用设置delta增量记录删除的数量 
}


4. 链表 删除范围内结点

已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。
试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),
分析你的算法的时间复杂度。

链表结点定义如下:
struct _lnklist{
    ElemType data;
    struct _lnklist *next;
};
typedef struct _lnklist Node;//结构标记 
typedef struct _lnklist *LinkList;//!! 
函数原型如下:
void lnk_del_x2y(LinkList L, ElemType mink, ElemType maxk)

#include "list.h" // 请不要删除,否则检查不通过
#include
#include

void lnk_del_x2y(LinkList L, ElemType mink, ElemType maxk){
    Node *p, *temp;
    
    for(p = L->next; p; p = p->next){
        if(p->data < maxk && p->data > mink){
            temp = p;
            p = p->next;
            free(p);
        }
        if(p->data > maxk)
            break;
    }
}
//解法2为指针跟踪技术 
void lnk_del_x2y(LinkList L, ElemType mink, ElemType maxk)
{
    Node *p, *pre;
    pre = L;
    p = L->next;
    for (; p;) {
        if (p->data > mink && p->data < maxk) {
            pre->next = p->next;
            free(p);
            p = pre->next;

        } else {
            pre = p;
            p = p->next;
        }
    }
}

5. 顺序表 删除重复

编写算法,在一非递减的顺序表L中,删除所有值相等的多余元素。
要求时间复杂度为O(n),空间复杂度为O(1)。
函数原型如下:
void del_dupnum(SeqList *L)

相关定义如下:
struct _seqlist{
    ElemType elem[MAXSIZE];
    int last;
};
typedef struct _seqlist SeqList;

#include "list.h" // 请不要删除,否则检查不通过
#include
#include


//这里是线性表中的顺序表,不是链表! 
void del_dupnum(SeqList *L){
    int i, j = 0, delta = 0;
    //一次遍历达到时间复杂度 
    for(i = 0; i < L->last; i++){
        if(L->elem[i] != L->elem[i+1])
            L->elem[j++] = L->elem[i];
        else
            delta++;
    }
    
    L->last -= delta;
}
//解法2 不用设置delta增量 
void del_dupnum(SeqList* L)
{
    int i, j = 1;
    for (i = 1; i <= L->last; i++) {
        if (L->elem[i] != L->elem[i - 1]) {
            L->elem[j++] = L->elem[i];
        }
    }
    L->last = j - 1;
}

6. 顺序表 数据调整

已知顺序表L中的数据元素类型为int。设计算法将其调整为左右两部分,
左边的元素(即排在前面的)均为奇数,右边所有元素(即排在后面的)均为偶数,
并要求算法的时间复杂度为O(n),空间复杂度为O(1)。

函数原型如下:
void odd_even(SeqList *L);

相关定义如下:
struct _seqlist{
    ElemType elem[MAXSIZE];
    int last;
};
typedef struct _seqlist SeqList;

#include "list.h" // 请不要删除,否则检查不通过
#include
#include

#define N 2 
//题目描述不清晰
//偶数内部排序顺序未知 
void odd_even(SeqList *L){
    int i, j;
    int x;
    
    for(i = 0, j = 0; i < L->last && i + 1 != L->last - j; i++){
    //for的另一种写法for (i = 0, j = 0; i <= L->last - j; i++) { 
        if(!(L->elem[i] % N)){//偶数 
            x = L->elem[L->last-j];
            L->elem[L->last-j] = L->elem[i];
            L->elem[i] = x;
            i--;
            j++;
        }
    }
}
 

icoding复习2 

1. 栈 后缀表达式计算
(1)如果是操作数,直接入栈
(2)如果是操作符op,连续出栈两次,得到操作数x 和 y,计算 x op y,并将结果入栈。
#define Stack_Size 50
typedef struct{
    ElemType elem[Stack_Size];
    int top;
}Stack;

bool push(Stack* S, ElemType x);
bool pop(Stack* S, ElemType *x);
void init_stack(Stack *S);
其中,栈初始化的实现为:
void init_stack(Stack *S){
    S->top = -1;
}
需要完成的函数定义为:int compute_reverse_polish_notation(char *str);
函数接收一个字符指针,该指针指向一个字符串形式的后缀表达式,函数返回该表达式的计算结果。

#include
#include
#include "list.h" // 请不要删除,否则检查不通过

//字符指针!!!!!!!!!!!!
//易错 
int compute_reverse_polish_notation(char* str)//光秃秃的*str 怎么用要知道 
{
    int i = 0;
    Stack S;
    //没必要*S 
    init_stack(&S);
    ElemType _push, num1, num2;
    
    //str[i]等价于*(str+i) 
    while (str[i] != '\0') {
    //    先判空 再判空格 再判数字和符号 数字判断是几位数 
        if (str[i] != ' ') {
            
            if (str[i] >= '0' && str[i] <= '9') { //!!
                _push = 0;
                
                while (str[i] != ' ') {
                    _push *= 10;
                    _push += (str[i] - '0'); 
                    //一个数字一个数字的压入 , 判断位数 
                    i++;
                }
                push(&S, _push);
                //每次_push会变, push函数里面top会++
                //切记 
            } else {
                //格外小心弹出来的顺序
                //先弹出来的符号对它作用 
                pop(&S, &num2);
                pop(&S, &num1);
            switch (str[i]) {
                case '+': {
                    num1 += num2;//注意两个操作数的顺序 
                    break;//!!!!!
                }
                case '-': {
                    num1 -= num2;
                    break;
                }
                case '*': {
                    num1 *= num2;
                    break;
                }
                case '/': {
                    if(num2)//判除数 
                        num1 /= num2;
                    break;
                }
                case '%': {
                    if(num2) 
                        num1 %= num2;
                    break;
                }
            }
            push(&S, num1);
            }
        }
        i++;
    }
    pop(&S, &num1);
    //最后的返回值也要弹出来 
    return num1;
}


2. 队列 循环链表表示队列
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),请完成下列任务:
1: 队列初始化,成功返回真,否则返回假: bool init_queue(LinkQueue *LQ);
2: 入队列,成功返回真,否则返回假: bool enter_queue(LinkQueue *LQ, ElemType x);
3: 出队列,成功返回真,且*x为出队的值,否则返回假 bool leave_queue(LinkQueue *LQ, ElemType *x);
typedef struct _QueueNode {
    ElemType data;          /*数据域*/
    struct _QueueNode *next;      /*指针域*/
}LinkQueueNode, *LinkQueue;
#include
#include
#include "list.h" // 请不要删除,否则检查不通过

bool init_queue(LinkQueue *LQ){
    
    //注意这里是给*LQ分配空间,不是LQ; 类比Node *p对于p的空间分配 
    if(!(*LQ = (LinkQueue)malloc(sizeof(LinkQueueNode)))) return false;
    
    (*LQ)->next = *LQ;
    return true;
}
//!!!
bool enter_queue(LinkQueue *LQ, ElemType x){
    LinkQueueNode *p;
    
    if(!(p = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)))) return false;
    
    p->data = x;
    //LQ为队尾指针
    //这一步顺序不要颠倒,循环队列连接到头结点 
    p->next = (*LQ)->next;
    //尾插入 
    (*LQ)->next = p;
    *LQ = p; 
    
    return true; 
}
  
//!!!
bool leave_queue(LinkQueue* LQ, ElemType* x)
{
    LinkQueueNode *first, *p;
    //first为头结点 
    first = (*LQ)->next;
    if (first == *LQ)
        return false;
    //注意的是头节点为空, 并且是自然形成的
    
    p = first->next;
    *x = p->data;
    if (p != *LQ) //这种情况只有一个尾结点可以释放
        first->next = p->next;
    else {//!!!
        *LQ = (*LQ)->next;//LQ变为头结点,尾指针指向头结点 
        (*LQ)->next = *LQ; //自己构成空循环
    }
    free(p);
    return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密电破译-dp

题目背景 墨家家主召集弟子的原因是因为截获了密电并破获了重大情报&#xff0c;“公主薨&#xff0c;国王失踪&#xff0c;墨家即将面临灭顶之灾”。 题目描述 密电是由大小写字母组成字符串&#xff0c;密电之所以能破译是因为墨家掌握了破解方法&#xff0c;密钥是一个整数…

ASP.NET Core Web API基于RESTFul APIs的集合结果过滤和分页

译者荐语&#xff1a;如何在RESTFul APIs中进行集合结果分页&#xff1f;还是用客户端来拼接链接地址么&#xff1f;原文来自互联网&#xff0c;由长沙DotNET技术社区【邹溪源】翻译。如译文侵犯您的版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。在ASP.NET Co…

icoding复习6 图

icoding复习6 1. 邻接表1 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc&#xff0c;相关定义如下&#xff1a; typedef int VertexType; typedef enum{ DG, UDG }GraphType; typedef struct ArcNode{ int adjvex; InfoPtr *info; stru…

python帮助系统函数_【Python】【基础知识】【内置函数】【help的使用方法】

原英文帮助文档&#xff1a;help([object])Invoke the built-in help system. (This function is intended for interactive use.) If no argument is given, the interactive help system starts on the interpreter console. If the argument is a string, then the string i…

统计二进制数-dp

题目描述 输入一个正整数m,请输出从0到m中每一个数字二进制数中含有1的个数的总和,由于数值较大结果需要模100000. 输入格式 一个m 输出格式 二进制数中含有1的个数的总和s 输入输出样例 输入 2 输出 2 输入 5 输出 7 说明/提示 样例说明 20%的数据 m<500 50%的数据 m<…

.net 微服务实践

l 前言本文记录了我的一次.net core 微服务架构实践经验&#xff0c;以及所用到的技术l 优点每个服务聚焦于一块业务&#xff0c;无论在开发阶段或是部署阶段都是独立的&#xff0c;更适合被各个小团队开发维护&#xff0c;团队对服务的整个生命周期负责&#xff0c;工作在独…

icoding复习3

icoding复习3 1. 不调用库函数&#xff0c;自己实现字符串的比较操作&#xff1a;该操作当比较的两个字符是都是字母&#xff0c;且两个字符互为大小写 &#xff08;如a和A、e和E&#xff09;时认为两个字符相同&#xff0c;否则不同&#xff0c;其比较结果按这两个字符的原值…

redis过期监听性能_基于Redis的延迟处理

延迟处理是一个非常常用的一个功能;例如, 下单成功后,在30分钟内没有支付,自动取消订单;延迟队列便是延迟处理中最常见的实现方式;先一起看下JDK中延迟队列是如何实现的.JUC的DelayQueue在JDK中, 提供了一套延迟队列的实现, 是JUC包中DelayQueue类.在使用时只需要让处理的元素对…

洛谷 P2040 打开所有的灯-dfs

题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏&#xff0c;目的是打开九盏灯所有的灯&#xff0c;这样的游戏难倒了pmshz。。。 题目描述 这个灯很奇(fan)怪(ren)&#xff0c;点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开这…

icoding复习4 数组 十字链表

icoding 复习4 1. 矩阵加法 实现三元组表示的两个稀疏矩阵的加法。 #define MAXSIZE 100 //假设非零元个数的最大值为100 typedef struct { int i,j; //非零元的行下标和列下标&#xff0c;i 和 j 从 1 开始计数&#xff0c;与数学中矩阵元素的…

【译】来看看WebWindow,一个跨平台的.NET Core webview 库

本文翻译自 ASP.NET 项目组的 Steve Sanderson 的博客&#xff0c;发表于 2019 年 11 月 18 日。Steve Sanderson 是 Blazor 最早的创造者。它类似于 Electron&#xff0c;但没有捆绑 Node.js 和 Chromium&#xff0c;也没有大部分 API。我的上一篇文章研究了如何用 web 渲染的…

sql if 和insert_拼多多面试:Mybatis是如何实现SQL语句复用功能的?

在工作中&#xff0c;往往有这样的需求&#xff0c;对于同一个sql条件查询&#xff0c;首先需要统计记录条数&#xff0c;用以计算pageCount&#xff0c;然后再对结果进行分页查询显示&#xff0c;看下面一个例子。<sql id"studentProperties"><!--sql片段-…

上元节的灯会(亮)-dfs

题目背景 上元佳节&#xff0c;庙会里举办着各式各样的庆典活动&#xff0c;牛宝也兴奋地参与其中。突然&#xff0c;他被一个新颖的点灯游戏所吸引&#xff0c;游戏要求最终点亮所有在场的花灯&#xff0c;每盏灯都有开关两种状态&#xff0c;每一次点击在场的一盏任意状态的花…

代码演示C#各版本新功能

代码演示C#各版本新功能C#各版本新功能其实都能在官网搜到&#xff0c;但很少有人整理在一起&#xff0c;并通过非常简短的代码将每个新特性演示出来。代码演示C#各版本新功能C# 2.0版 - 2005泛型分部类型匿名方法可以为null的值类型迭代器协变和逆变C# 3.0版 - 2007自动实现的…

icoding复习5 树 感觉难度巨大....

icoding 复习5 1. 先序遍历 已知二叉树按照二叉链表方式存储&#xff0c;利用栈的基本操作写出先序遍历非递归形式的算法&#xff1a; void pre_order(BiTree root); 二叉树的相关定义如下&#xff1a; typedef int DataType; typedef struct Node{ DataType data; …

python 进行一元线性回归并输出相关结果_Python实现一元线性回归实战

回归是一种有监督的学习方式&#xff0c;需要根据历史数据对未知数据做出预测。在此&#xff0c;以房屋面积预测房屋价格为例&#xff1a;首先&#xff0c;读入数据&#xff1a;代码如下&#xff1a;import pandas as pdimport numpy as npfrom io import StringIOfrom sklearn…

《C++ Primer》第一章的 Sales_item.h头文件源码

Sales_item.h不是C自带的&#xff0c;需要自己安装&#xff0c;这个库作者已经写好了, Sales_item.h 头文件代码如下&#xff1a; #ifndef SALESITEM_H #define SALESITEM_H #include <iostream> #include <string>class Sales_item{ public:Sales_item(const std…

icoding复习7, 8

icoding复习7 哈希,AVL 查找 必考点!!! 1. 哈希表创建 typedef enum{ HASH_OK, HASH_ERROR, HASH_ADDED, HASH_REPLACED_VALUE, HASH_ALREADY_ADDED, HASH_DELETED, HASH_NOT_FOUND, } HASH_RESULT; typedef struct __HashEntry HashEntry; struc…

python加载模型包占用内存多大_加载pickle python对象会占用大量内存

我有一个python的pickle对象,它生成一个180 Mb的文件.当我取消它时,内存使用量会爆炸到2或3Gb.你有类似的经历吗&#xff1f;这是正常的吗&#xff1f;对象是包含字典的树&#xff1a;每个边是一个字母,每个节点都是一个潜在的单词.因此,要存储一个单词,您需要的边数与该单词的…

《C++ Primer》1.52节练习

练习1.23 #include <iostream> #include "Sales_item.h"using namespace std;int main() {Sales_item trans1, trans2;cout << "请输入若干销售记录:" << endl;if (cin >> trans1) {int num 1;while (cin >> trans2)if (t…