数据结构课程设计——用单链表存储多项式实现多项式相加(提供源码和报告)

一、需求分析

  该程序涉及要求利用单链表数据结构存储多项式,因此要用到单链表的定义,初始化,输入输出等基本操作。

二、概要设计

  定义一个typedef struct Node2的结构体,结构体中包含有整型的指数、浮点型的系数和结构体指针next。另外定义结构体变量Node2和结构体指针PNode2,在后面的代码中会用到这两个来实现各函数的小功能。

typedef int DataType;//定义DataType为int 类型 
typedef struct Node2{
    float xishu;//系数 
    int zhisu;//指数 
    struct Node2 *Next;//结构指针 
}Node2;
typedef struct Node2* PNode2;

三、详细设计

  在程序的主页面首先会提示输入第一个多项式的数据(最后输入0,0来结束数据输入),输完之后会把输入的数据按指数大小从小到大排列显示出来,接着提升输入第二个多项式的数据,并按指数大小从小到大显示出来,最后显示两个多项式 相加的结果。

四、部分代码

  1、多项式的加法运算,代码功能的主体,这只是部分代码:

//多项式的加法计算
void add_poly(Node2 *pa,Node2 *pb){
    Node2 *p=pa->Next;
    Node2 *q=pb->Next;
    Node2 *pre=pa;
    Node2 *u;
{

  2、多项式按照指数大小排序,小的排在最前面,大的排在后面:

//多项式按照指数大小排序

void insertNewPoint_link(PNode2 head,PNode2 qNode){
    PNode2 p=head;
    while (p->Next!=NULL)
    {
        if (p->Next->zhisu>qNode->zhisu)
        {
            qNode->Next=p->Next;
            p->Next=qNode;
            break;
        }
        p=p->Next;
    }
    if (p->Next==NULL)
    {
        p->Next=qNode;

    }
}

  3、主函数,程序开始执行的部分和整个程序的控制部分:

int main(){

    int zhishu;
    float xishu;
    PNode2 head1=(PNode2)malloc(sizeof(struct Node2));
    PNode2 head2=(PNode2)malloc(sizeof(struct Node2));
    PNode2 tem=NULL;
    head1->Next=NULL;
    head2->Next=NULL;

    printf("输入链表一的系数和指数,如:3,2 以0,0结束输入:\n");
    scanf("%f,%d",&xishu,&zhishu);
    while (xishu!=0||zhishu!=0)
    {
        tem=(PNode2)malloc(sizeof(struct Node2));
        tem->xishu=xishu;
        tem->zhisu=zhishu;
        tem->Next=NULL;
        insertNewPoint_link(head1,tem);
        scanf("%f,%d",&xishu,&zhishu);
    }
    printf("链表一按指数升序排序后的多项式为:\n");
    printLinkeLink(head1);

    printf("\n");

    printf("输入链表二的系数和指数,如:3,2 以0,0结束输入:\n");
    scanf("%f,%d",&xishu,&zhishu);
    while (xishu!=0||zhishu!=0)
    {
        tem=(PNode2)malloc(sizeof(struct Node2));
        tem->xishu=xishu;
        tem->zhisu=zhishu;
        tem->Next=NULL;
        insertNewPoint_link(head2,tem);
        scanf("%f,%d",&xishu,&zhishu);
    }
    printf("链表二按指数升序排序后的多项式为:\n");
    printLinkeLink(head2);
    printf("\n");

    add_poly(head1,head2);
    printf("多项式相加后的结果为:\n");
    printLinkeLink(head1);
}

五、测试结果

  测试结果和预想中一样,可以完美而优雅的实现该功能:
数据结构课程设计——用单链表存储多项式实现多项式相加(提供源码和报告)_第1张图片

六、源码和报告

收藏点赞关注后,私信我获取

 

#include 

using namespace std;
typedef long long ll;
const int N = 2e5+10;
int w[N];
int n;
ll T;
int main() 
{
    scanf("%d%lld",&n,&T);
    for(int i=0;i<n;i++) scanf("%d",&w[i]);
    ll res=0; // 最后的糖果数量 
    while(1)
    {
        ll cnt=0,sum=0; // cnt 这一圈购买的糖果数量,sum 这一圈花的钱
        for(int i=0;i<n;i++) 
         if(sum+w[i]<=T)
         {
            cnt++;
            sum += w[i]; 
         }
        if(!cnt) break; // 如果不能买任何糖果了就break 
        res += T / sum * cnt; //优化:如果当前钱可以让其再走完与上面相同的钱和糖果数,就让其走到不能走为止 
        T %= sum;
    }
    printf("%lld\n",res);
    return 0;
}


// 时间复杂度 O(nlog(T))
/*
每一次T最少除以2

sum <= T
1. sum > T/2 ,T % sum = T-sum < T/2;
2. sum < T/2 ,T % sum < sum < T/2; 
*/


#include
#include
#define int long long
using namespace std;
inline int read(){
    int w=0,x=0;char ch;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return w?-x:x;
}
int dep[500005],size[500005];
int fa[500005],dis[500005],son[500005],top[500005];
struct edge{
    int to,l;
    edge(int to,int l) :to(to),l(l){}
};
vector <edge > e[500005];
int n=3;
int g,h;
void add(int u,int v,int len){
    e[u].push_back(edge(v,len));
    e[v].push_back(edge(u,len));
}
void dfs1(int now,int f){
    dep[now]=dep[f]+1,fa[now]=f;
    size[now]=1;
    for(int i=0;i<e[now].size();i++){
        int to=e[now][i].to,l=e[now][i].l;
        if(to==f) continue;
        dis[to]=dis[now]+l;
        dfs1(to,now);
        size[now]+=size[to];
        if(size[to]>size[son[now]]) son[now]=to;
    }
}
void dfs2(int x,int y){
    top[x]=y;
    if(son[x]) dfs2(son[x],y);
    for(int i=0;i<e[x].size();i++){
        int to=e[x][i].to;
        if(to==son[x]||to==fa[x]) continue;
        dfs2(to,to);
    }
}
int lca(int x,int y){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        x=fa[top[x]];
    }
    return dep[x]<dep[y]?x:y;
}
int getdis(int x,int y){
    return dis[x]+dis[y]-2*dis[lca(x,y)];
}
signed main(){
    g=read(),h=read();
    add(1,2,g),add(1,3,h);
    dfs1(1,0);
    dfs2(1,1);
    cout<<getdis(2,3);
    return 0;
}
 噫吁嚱,危乎高哉!蜀道之难,难于上青天!蚕丛及鱼凫,开国何茫然!尔来四万八千岁,不与秦塞通人烟。西当太白有鸟道,可以横绝峨眉巅。地崩山摧壮士死,然后天梯石栈相钩连。上有六龙回日之高标,下有冲波逆折之回川。黄鹤之飞尚不得过,猿猱欲度愁攀援。青泥何盘盘,百步九折萦岩峦。扪参历井仰胁息,以手抚膺坐长叹。

问君西游何时还?畏途巉岩不可攀。但见悲鸟号古木,雄飞雌从绕林间。又闻子规啼夜月,愁空山。蜀道之难,难于上青天,使人听此凋朱颜!连峰去天不盈尺,枯松倒挂倚绝壁。飞湍瀑流争喧豗,砯崖转石万壑雷。其险也如此,嗟尔远道之人胡为乎来哉!

剑阁峥嵘而崔嵬,一夫当关,万夫莫开。所守或匪亲,化为狼与豺。朝避猛虎,夕避长蛇;磨牙吮血,杀人如麻。锦城虽云乐,不如早还家。蜀道之难,难于上青天,侧身西望长咨嗟! 

你可能感兴趣的:(其他,数据结构)