知识框架
文章汇总
顺序表VS链表
补充
一元多项式的抽象数据类型定义、表示及加法的实现。
- 顺序表
#include<bits/stdc++.h>
using namespace std;
//线性表
typedef struct{
float coef;//系数
int exp;//指数
}Node;
typedef struct {
Node *elem;
int length;
}LinkList;
//初始化
bool Initpolyn(LinkList &L,int n){
//初始化
L.elem = (Node *) malloc(sizeof(Node)*n);
if (L.elem == NULL){
return false;
}
L.length = 0;
//输入
int a,b;
cout<<"2*X^4,输入2 4"<<endl;
for (int i = 0; i < n; ++i) {
cin>>a>>b;
L.elem[i].coef = a;
L.elem[i].exp = b;
L.length++;
}
return true;
}
//相加 La + Lb = Lc
bool add(LinkList &La,LinkList &Lb,LinkList &Lc){
Lc.elem = (Node *) malloc(sizeof(Node)*(La.length+Lb.length));
if (La.length == 0){
Lc = Lb;
return true;
}
if (Lb.length == 0){
Lc = La;
return true;
}
int i = 0,j = 0,k = 0;//分别记录La、Lb、Lc
while (i < La.length && j < Lb.length){
if (La.elem[i].exp < Lb.elem[j].exp){
Lc.elem[k] = La.elem[i];
i++;
k++;
} else if (La.elem[i].exp == Lb.elem[j].exp){
//这里需要注意:La和Lb的系数之和等于0,就不需要插入结点
if ((La.elem[i].coef + Lb.elem[j].coef) != 0){
Lc.elem[k].exp = La.elem[i].exp;
Lc.elem[k].coef = La.elem[i].coef + Lb.elem[j].coef;
k++;
}
i++;
j++;
} else {
Lc.elem[k] = Lb.elem[j];
j++;
k++;
}
}
while (i < La.length){
Lc.elem[k] = La.elem[i];
i++;
k++;
}
while (j < Lb.length){
Lc.elem[k] = La.elem[j];
j++;
k++;
}
Lc.length = k;
return true;
}
int main(){
LinkList La,Lb,Lc;
Initpolyn(La,4);
Initpolyn(Lb,3);
//合并
add(La,Lb,Lc);
for (int i = 0; i < Lc.length; ++i) {
cout<<Lc.elem[i].coef<<"*X^"<<Lc.elem[i].exp<<" ";
}
return 0;
}
- 链表
#include<bits/stdc++.h>
using namespace std;
//线性表
typedef struct Node{
float coef;//系数
int exp;//指数
struct Node *next;
}Node,*LinkList;
//初始化
void Initpolyn(LinkList &L,int n){
//初始化(带头结点)
L = (Node *) malloc(sizeof(Node));
L->next = NULL;
//尾插法
Node *rear = L;
int a,b,i=0;
Node *s;
cout<<"2*X^4,输入2 4"<<endl;
while (i < n){
cin>>a>>b;
s = (Node *) malloc(sizeof(Node));
s->coef = a;
s->exp = b;
rear->next = s;
rear = s;
i++;
}
rear->next = NULL;
}
//合并La+Lb=Lc
void add(LinkList La,LinkList Lb,LinkList &Lc){
Lc = (Node *) malloc(sizeof(Node));
Lc->next = NULL;
Node *pa,*pb;
pa = La->next;
pb = Lb->next;
Node *s;
Node *r=Lc;
while (pa&&pb){
if (pa->exp < pb->exp){
s = (Node *)malloc(sizeof(Node));
s->exp = pa->exp;
s->coef = pa->coef;
r->next = s;
r = s;
pa = pa->next;
} else if (pa->exp > pb->exp){
s = (Node *)malloc(sizeof(Node));
s->exp = pb->exp;
s->coef = pb->coef;
r->next = s;
r = s;
pb = pb->next;
} else{
if ((pa->coef+pb->coef) != 0){
s = (Node *)malloc(sizeof(Node));
s->exp = pa->exp;
s->coef = pa->coef+pb->coef;
r->next = s;
r = s;
}
pa = pa->next;
pb = pb->next;
}
}
while (pa){
s = (Node *)malloc(sizeof(Node));
s->exp = pa->exp;
s->coef = pa->coef;
r->next = s;
r = s;
pa = pa->next;
}
while (pb){
s = (Node *)malloc(sizeof(Node));
s->exp = pb->exp;
s->coef = pb->coef;
r->next = s;
r = s;
pb = pb->next;
}
r->next = NULL;
}
int main(){
LinkList La,Lb,Lc;
Initpolyn(La,4);
Initpolyn(Lb,4);
add(La,Lb,Lc);
Node *p = Lc->next;
while(p){
cout<<p->coef<<"*X^"<<p->exp<<" ";
p = p->next;
}
return 0;
}