函数名字功能:
//创建长度为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;
}