zoukankan      html  css  js  c++  java
  • 中国大学MOOC_浙大数据结构_第二周编程作业

    第二周编程作业

    1、两个有序链表序列的合并

    List Merge( List L1, List L2 ) {
        
        List temp, cur, result;
        
        // 0. 初始化
        result = (List) malloc(sizeof(struct Node));
        cur = result;
        
        while (L1->Next && L2->Next) {
            // 1. 比较 
            if (L1->Next->Data <= L2->Next->Data) {
                // 2. 取小的那个
                temp = L1->Next;
                // 3. 改造原链表 
                L1->Next = temp->Next;
            } else {             
                temp = L2->Next;            
                L2->Next = temp->Next;            
            }
            
            // 4. 插到结果链表尾部
            cur->Next = temp;
            cur = cur->Next;
        }
        
        // 5. 破坏条件
        cur->Next = L1->Next ? L1->Next : L2->Next;
        if (L1->Next) {
            L1->Next = NULL;
        } else {
            L2->Next = NULL;
        }    
        
        return result;
    }

    2、一元多项式的乘法与加法运算

    #include <cstdio>
    #include <cstdlib>
    
    typedef struct polynomial_node* polynomial;
    struct polynomial_node {
        int xs; // 系数 
        int zs; // 指数 
        polynomial next;    
    };
    typedef struct polynomial_node* Node;
    
    polynomial readPoly() 
    {
        int n, xs, zs; 
        // 1. 先读有多少位
        scanf("%d", &n);
        // 2. 创建多项式的头结点 
        polynomial result, temp, rear;
        rear = result = (polynomial) malloc(sizeof(struct polynomial_node));    
        while (n--) {
            // 3. 逐个添加多项式的项 
            scanf("%d %d", &xs, &zs);
            // 创建项 
            temp = (polynomial) malloc(sizeof(struct polynomial_node));
            temp->xs = xs;
            temp->zs = zs;
            // 添加项 
            rear->next = temp;
            rear = rear->next;
        }
        rear->next = NULL; 
        return result;    
    }
    
    void printPoly(polynomial poly)
    {
        if (poly->next == NULL) {
            printf("0 0
    ");
            return;
        }
        printf("%d %d", poly->next->xs, poly->next->zs);
        poly = poly->next;
        while (poly->next) {
            printf(" %d %d", poly->next->xs, poly->next->zs);
            poly = poly->next;
        }    
        printf("
    ");
    }
    
    Node buildNode(int xs, int zs)
    {
        Node node = (Node) malloc(sizeof(struct polynomial_node));
        node->xs = xs;
        node->zs = zs;
        node->next = NULL;
        
        return node;    
    };
    
    Node copyNode(Node node)
    {
        return buildNode(node->xs, node->zs);
    };
    
    polynomial add(polynomial p1, polynomial p2)
    {
        polynomial result, rear;
        rear = result = (polynomial) malloc(sizeof(struct polynomial_node));
        result->next = NULL; 
        
        p1 = p1->next;
        p2 = p2->next; // p1 和 p2 都有头结点 
            
        while (p1 && p2) {
            // 1. 比较
            if (p1->zs > p2->zs) { 
                // 2. 取大的那一项添加到结果链表
                rear->next = copyNode(p1);
                rear = rear->next; 
                
                // 3. p1指向下一位 
                p1 = p1->next;
                
            } else if (p1->zs < p2->zs) {
                rear->next = copyNode(p2);
                rear = rear->next; 
                
                p2 = p2->next;        
            } else {
                // 相等的情况,指数不变系数相加
                if (p1->xs + p2->xs != 0) {
                    rear->next = buildNode(p1->xs + p2->xs, p1->zs);
                    rear = rear->next;                
                }           
                
                p1 = p1->next;
                p2 = p2->next;            
            }
        } 
        
        // 4. 破坏条件
        while (p1) {
            rear->next = copyNode(p1);
            rear = rear->next;
            
            p1 = p1->next;    
        }
        
        while (p2) {
            rear->next = copyNode(p2);
            rear = rear->next;
            
            p2 = p2->next;            
        }
    
        return result;
    }
    
    // 多项式乘以一项 
    polynomial multi0(polynomial p, Node node)
    {
        polynomial result, rear;
        rear = result = (polynomial) malloc(sizeof(struct polynomial_node));
        result->next = NULL; 
        
        p = p->next; // p有头结点 
        while (p) {
            rear->next = buildNode(p->xs * node->xs, p->zs + node->zs);
            rear = rear->next;
                    
            p = p->next;
        }
        
        return result;        
    }
    
    polynomial multi(polynomial p1, polynomial p2)
    {
        // 将乘法运算转化为加法运算 
        polynomial result = (polynomial) malloc(sizeof(struct polynomial_node)), temp;
        result->next = NULL; 
            
        Node node = p2->next;    
        while (node) {
            temp = multi0(p1, node);
            result = add(result, temp);
            node = node->next;
        }
        
        return result;
    }
    
    int main()
    {
        // 1. 读 2 个 多项式
        polynomial p1 = readPoly();
        polynomial p2 = readPoly();
        // 2. 相乘与相加
        polynomial pa = multi(p1, p2);
        polynomial pb = add(p1, p2);
        // 3. 输出结果 
        printPoly(pa);
        printPoly(pb);
        return 0;
    }

    3、Reversing Linked List

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Node {
        int val;
        int next;
    };
    typedef struct Node* MyNode;
    
    MyNode buildNode(int val, int next)
    {
        MyNode result = (MyNode) malloc(sizeof(struct Node));
        result->val = val;
        result->next = next;
        
        return result;
    }
    
    MyNode nodes[(int) 1e5 + 1];
    int order[(int) 1e5 + 1];
    
    void reverse(int a[], int i, int j)
    {
        int tmp;
        while (i < j) {
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
            
            i++;
            j--;
        }
    }
    
    int main()
    {
        int firstAddress, n, k, address, val, next;
        
        scanf("%d %d %d", &firstAddress, &n, &k);
        
        // 1. 读入数据 
        for (int i = 0; i != n; ++i) {
            scanf("%d %d %d", &address, &val, &next);
            nodes[address] = buildNode(val, next);
        }
        
        // 2. 将数据按原逻辑顺序存储到order数组 
        int realN = 0; // realN用于统计真正在链表上的结点数(有的结点不在链表上) 
        address = firstAddress;
        while (address != -1) {
            order[realN++] = address;             
            address = nodes[address]->next;        
        }
        
        // 3. 重排序 
        int batch = realN / k;
        for (int i = 0; i != batch; ++i) {
            reverse(order, i * k, (i + 1) * k - 1);
        }
        
        // 4. 输出结果
        for (int i = 0; i != realN - 1; ++i) {
            printf("%5.5d %d %5.5d
    ", order[i], nodes[order[i]]->val, order[i + 1]);
        }
        printf("%5.5d %d -1
    ", order[realN - 1], nodes[order[realN - 1]]->val);
        
        return 0;
    }
     

    4、Pop Sequence

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h> // bool true false
    #define MAX 1000 + 1
    #define STACK_EMPTY -1
    
    struct Stack {
        int a[MAX];
        int maxSize;
        int top;    
    };
    typedef struct Stack* MyStack;
    
    MyStack buildStack(int maxSize)
    {
        MyStack result = (MyStack) malloc(sizeof(struct Stack));
        result->maxSize = maxSize;
        result->top = STACK_EMPTY;
        
        return result;
    }
    
    void clearStack(MyStack s)
    {
        s->top = STACK_EMPTY;
    }
    
    bool push(MyStack s, int val)
    {
        if (s->top == s->maxSize - 1) return false;
        s->a[++(s->top)] = val;
        return true;
    }
    
    void pop(MyStack s)
    {
        if (s->top != STACK_EMPTY) {
            s->top = s->top - 1;
        }    
    }
    
    int topVal(MyStack s)
    {
        if (s->top == STACK_EMPTY) return STACK_EMPTY;
        return s->a[s->top];
    }
    
    bool check(MyStack s, int N, int checkSeq[])
    {
        int cur = 0;
        int curPushVal = 1;
        bool ok = false;
        for (int i = 0; i != N + N; ++i) {
            if (topVal(s) == checkSeq[cur]) {
                pop(s);
                cur++;
            } else {
                if (curPushVal > N) return false;
                ok = push(s, curPushVal++);
                if (!ok) return false;
            }        
        }
        return true;
    }
    
    int checkSeq[MAX];
    
    int main()
    {
        int M, N, K;
        // M (the maximum capacity of the stack), 
        // N (the length of push sequence), 
        // K (the number of pop sequences to be checked). 
        
        scanf("%d %d %d", &M, &N, &K);
        
        MyStack s = buildStack(M);
        
        for (int i = 0; i != K; ++i) {
            for (int j = 0; j != N; ++j) {
                scanf("%d", &checkSeq[j]);
            }
            printf("%s
    ", check(s, N, checkSeq) ? "YES" : "NO");
            clearStack(s);
        }
            
        return 0;
    }
  • 相关阅读:
    javascript重点笔记
    我的CSS架构
    排行榜妙用——CSS计数器
    回归基础从新认识——HTML+CSS
    前端开发工具(安装及常用技巧)——sublime text 3
    手机访问php环境移动端静态页面
    H5前端面试题及答案(2)
    H5前端面试题及答案(1)
    python笔记--学会使用Fiddler
    python进程/线程/协成
  • 原文地址:https://www.cnblogs.com/xkxf/p/11420068.html
Copyright © 2011-2022 走看看