数据结构课程作业——链表

在这里插入图片描述
函数名字功能:

//创建长度为n,表头为head的单链表 尾插法
void init_1(link &head, int n);
//删除递增顺序链表大于等于mink 小于等于maxk的数
void erase_1(link &head, int mink, int maxk);
//输出单链表
void print_1(link &L);
//创建长度为n,表头为head的循环单链表
void init_2(link &head, int n);
//删除头指针为h的带表头结点的循环单链表中所有奇数。
void erase_2(link &head);
//输出循环单链表
void print_2(link &head);
// 创建项数为n的多项式,如n = 3时,
//input  2 3 4 4 5 8
//表示的多项式为6x^2 16x^3 40x^7 
void init_3(dlink &head, int n);
//求导
void Derivation(dlink &head);
//输出多项式,对上面的input求导后
//output 6x^1 12x^3 20x^4 
void print_3(dlink &head);
#include <bits/stdc++.h>
using namespace std;
typedef struct Node {
    struct Node *nxt;
    int data;
}Node, *link;

typedef struct DNode {
    struct DNode *nxt;
    int a, b;   //表示ax^b
}DNode, *dlink;

//创建长度为n,表头为head的单链表
void init_1(link &head, int n) {
    //创建头指针
    head = new Node;
    head->nxt = NULL;
    link tail = head;  //tail表示单链表的尾节点,初始与表头相同
    //添加元素
    for(int i = 1; i <= n; i++) {
        link p = new Node;
        scanf("%d", &p->data);  //读入一个新节点并存入p
        p->nxt = NULL;  //新节点为尾节点,nxt标为NULL
        tail->nxt = p;   //更新尾节点
        tail = p; //更新尾节点
    }
}
//删除递增顺序链表大于等于mink 小于等于maxk的数
void erase_1(link &head, int mink, int maxk) {
    link p;
    p = head;  //初始p指向链表头(并没有存data)
    //如果当前元素p的后继非空,且它的data < mink,向后遍历,直到找到第一个p的后继的data >= mink
    while(p->nxt != NULL && (p->nxt)->data < mink)
        p = p->nxt;
    //之所以要(p->nxt).data >= mink而不是p.data >- mink,是因为已知节点p,可以轻松删除p的后继,
    //却很难删除p。(因为需要把p的前驱的后继设置成p的后继,而p的前驱并不知道在哪)
    //如果当前元素p的后继不是链表最后一个元素,且p.data <= maxk,则删除p
    while(p->nxt != NULL && (p->nxt)->data <= maxk) { //即删除p的后继
        link q = p -> nxt;
        p->nxt = q->nxt;
        free(q);    //也就是释放p.nxt 因为p的后继变成了p.nxt的后继,p.nxt已经无用
    }
}
void print_1(link &L) {
    link p = L -> nxt;
    while(p != NULL) {
        printf("%d ", p->data);
        p = p->nxt;
    }
    cout << endl;
}
//创建长度为n,表头为head的循环单链表
void init_2(link &head, int n) {
    //创建头指针
    head = new Node;
    head->nxt = NULL;
    link tail = head;  //tail表示单链表的尾节点,初始与表头相同
    //添加元素
    for(int i = 1; i <= n; i++) {
        link p = new Node;
        scanf("%d", &p->data);  //读入一个新节点并存入p
        p->nxt = NULL;  //新节点为尾节点,nxt标为NULL
        tail->nxt = p;   //更新尾节点
        tail = p; 
    }
    tail->nxt = head;
}
//删除头指针为h的带表头结点的循环单链表中所有奇数。
void erase_2(link &head) {
    link p;
    p = head;
    //因为是循环链表,所以判断尾节点的方法和普通链表不一样
    while(p->nxt != head) {
        if((p->nxt)->data & 1) { //如果是奇数,删除; 否则 p = p -> nxt
            link q = p -> nxt;
            p->nxt = q->nxt;
            free(q);    //也就是释放p.nxt
        }
        else
            p = p -> nxt;
    }
}
void print_2(link &head) {
    link p = head -> nxt;
    while(p != head) {
        printf("%d ", p->data);
        p = p->nxt;
    }
    cout << endl;
}
void init_3(dlink &head, int n) {
    head = new DNode;
    head->nxt = NULL;
    dlink tail = head;  //tail表示单链表的尾节点,初始与表头相同
    //添加元素
    for(int i = 1; i <= n; i++) {
        dlink p = new DNode;
        scanf("%d%d", &p->a, &p->b);  //读入一个新节点并存入p
        p->nxt = NULL;  //新节点为尾节点,nxt标为NULL
        tail->nxt = p;   //更新尾节点
        tail = p; 
    }
}
//求导
void Derivation(dlink &head) {
    dlink p = head;
    while(p -> nxt != NULL) {
        p = p -> nxt;
        p -> a *= p -> b;	
        if(p -> b)
            p -> b--;	//(ax^b)' = abx^(b-1)
        else
            p -> a = 0;	//若b == 0即为常数求导
    }
}
void print_3(dlink &head) {
    dlink p = head;
    while(p -> nxt != NULL) {
        p = p -> nxt;
        if(p -> a == 0) continue;	//若系数是0,continue
        printf("%d", p->a);
        printf("x^%d ", p->b);
    }
    cout << endl;
}
//两个升序链表合并成降序链表
void Combine(link head1, link head2) {
    link p1 = head1, p2 = head2;    //两个指针
    
}
/*
 init_1(),erase_1(),print_1()对应单链表
 _2对应循环单链表
 _3对应多项式
 */
int main() {
    int n = 3;
    /*
    link L1;
    init_1(L1, 5);
    erase_1(L1, 3, 5);
    print(L1);
     */
    /*
    link L2;
    init_2(L2, 5);
    erase_2(L2);
    print_2(L2);
     */
    /*
    dlink L3;
    init_3(L3, 3);
    Derivation(L3);
    print_3(L3);
     */
    link pa, pb;
    init_1(pa, n);
    init_1(pb, n);
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值