C语言单链表实现多项式的相乘

此次写该程序的时候费了不少劲,主要是在调试代码上,但是也花费了不少时间在构思代码的方法上,我做该程序时的思路如下:
1.首先构出两个多项式

head1=3 + 4x + 7x^2 +7x^9
head2=1 + 4x^2 + 8x^3 + 4x^6

  1. 人为计算的时候是head1中的每一项依次和head2中的每一项进行计算的,所以我用结构体数组存储该新形成的链表

p[0]=3*(1 + 4x^2 + 8x^3 + 4x^6)//用单链表存储
p[1]=4x * (1 + 4x^2 + 8x^3 + 4x^6)
p[2]=7x^2 * (1 + 4x^2 + 8x^3 + 4x^6)
p[3]=7x^9 * (1 + 4x^2 + 8x^3 + 4x^6)

  1. 将p[0]->p[3]连接成一个总链表
    函数:void combineAll(NODE arr[], int n)

p=3 + 12x^2 +24x^3 +12x^6 +4x + 16 x^3 +32x^4 +16 x^7 +7x^2 +28x^4 +56x^5 +28x^8 +7x^9 +28x^11 + 56x^12 +28x^15
并将所有的指数存在num[lenth]数组里面

  1. 当然不能这样输出要整理下,所以我想了个函数用来处理指数相同的项,并将系数相加
    函数:void SD(int num[],int n)
void SD(int num[],int n)//找到有几种不同的指数
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if ((num[j] == num[i]) && (j != i)&&(num[j]!=-1))
            {
                num[j] = -1;
            }
        }
    }
    
    for (int i = 0; i < n; i++)
    {
        if (num[i] != -1)
        {
            Arr[cnt1] = num[i];
            cnt1++;//cnt1是全局变量因为要计算有几种不同的指数
        }
    }
}
  1. 处理指数的排序问题
    函数:void swapData(NODE head)
    只交换数据域不交换链表的指针
  2. 完整代码如下
#include<stdio.h>
#include <stdlib.h>
#define lenth 16
typedef struct node
{
    int index;
    int coef;
    struct node*next;
}node, *NODE;
int Arr[lenth] = { -1 };//全局变量,用来存储指数
int cnt1 = 0;
void initNode(NODE *head)//初始化头结点
{
    (*head) = (NODE)malloc(sizeof(node));
    (*head)->next = NULL;
}
NODE typeData(NODE head, int index[], int coef[], int len)//给相乘的两个单链表输入数据
{
    //head必须在主函数里面申请过空间设置对象
    NODE p;
    p = head;
    for (int i = 0; i < len; i++)
    {
        NODE temp = (NODE)malloc(sizeof(node));
        temp->index = index[i];
        temp->coef = coef[i];
        p->next= temp;
        p = temp;
        temp->next = NULL;
    }
    return head;
}
void mutipleFunc(NODE add[],NODE head1, NODE head2, int len1, int len2)//功能函数
{
    NODE p, begin;
    p = head1;
    p = p->next;
    for (int i = 0; i < len1; i++)
    {
        NODE q = head2->next;
        begin = add[i];
        for (int j = 0; j < len2; j++)
        {
            NODE temp = (NODE)malloc(sizeof(node));
            temp->index = p->index + q->index;//指数相加
            temp->coef = p->coef * q->coef;//系数相乘
            begin->next = temp;
            begin = temp;

            temp->next = NULL;
            q = q->next;
        }
        p = p->next;
    }
}
void showNode(NODE *head)
{
    NODE p;
    p = (*head);
    p = p->next;
    while (p!= NULL)
    {
        printf("系数是%d,指数是%d\n", p->coef, p->index);
        p = p->next;
    }
}
void SD(int num[],int n)//找到有几种不同的指数
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if ((num[j] == num[i]) && (j != i)&&(num[j]!=-1))
            {
                num[j] = -1;
            }
        }
    }
    
    for (int i = 0; i < n; i++)
    {
        if (num[i] != -1)
        {
            Arr[cnt1] = num[i];
            cnt1++;
        }
    }
}
void swap(int *data1, int *data2)
{
    int temp;
    temp = (*data1);
    (*data1) = (*data2);
    (*data2) = temp;
}
void swapData(NODE head)//只交换数据域
{
    NODE p,q;
    p = head;
    p = p->next;
    int i = 0;
    while (p->next != NULL)
    {
        q = head;
        for (int j = 0; j <= i; j++)
        {
            q = q->next;
        }
        while (q->next != NULL)
        {
            q = q->next;
            if (p->index > q->index)
            {
                swap(&p->index, &q->index);
                swap(&p->coef, &q->coef);
            }
        }
        p = p->next;
        i++;
    }
}
NODE combineAll(NODE arr[], int n)//多个多项式相加首先这些多项式都是顺序的
{
    NODE p, q, head;
    head = (NODE)malloc(sizeof(node));
    p = head;//p指针指向head
    for (int i = 0; i < n; i++)//将所有的多项式合并为一个式子
    {
        q = arr[i]->next;
        while (q != NULL)
        {
            p->next = q;
            p = q;
            q = q->next;
        }
    }
}
    //判断有几个不同的指数
void function(NODE head)
{   
        NODE SchIndex;
    SchIndex = head;
    SchIndex = SchIndex->next;
    int cnt = 0;
    int num[lenth] = { 0 };
    while (SchIndex != NULL)//将所有的指数存在数组num[]中
    {
        num[cnt] = SchIndex->index;
        cnt++;
        SchIndex = SchIndex->next;
    }
    SD(num, cnt);
    NODE New, P;
    New = (NODE)malloc(sizeof(node));
    New->next = NULL;
    New->index = -1;
    New->coef = -1;
    P = New;
    int j = 0;
    while (j < cnt1)
    {
        NODE m;
        m = head;
        m = m->next;
        int sumCoef = 0;
        NODE temp = (NODE)malloc(sizeof(node));
        while (m != NULL)
        {
            if (m->index == Arr[j])
            {
                sumCoef = sumCoef + m->coef;
            }
            m = m->next;
        }
        temp->coef = sumCoef;
        temp->index = Arr[j];
        temp->next = NULL;
        P->next = temp;
        P = temp;
        j++;
    }
    swapData(New);
    showNode(&New);
}
int main()
{
    NODE head1, head2,head;
    NODE add[lenth];
    for (int i = 0; i < lenth; i++)
    {
        initNode(&add[i]);
    }
    //初始化多项式
    initNode(&head1);
    initNode(&head2);
        initNode(&head);
    //系数和指数用数组赋值
    int arr_index[4] = { 0,1,2,9};
    int arr_coef[4] = { 3,4,7,7};
    int Arr_index[4] = { 0,2,3,6};
    int Arr_coef[4] = { 1,4,8,4};
    //输入多项式数据
    typeData(head1, arr_index, arr_coef, 4);
    typeData(head2, Arr_index, Arr_coef, 4);
    //功能函数
    mutipleFunc(add,head1, head2, 4, 4);
    //多项式合并成一个式子
    head=combineAll(add, 4);
    function(head);
    system("pause");
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容