Jayden


私信TA

用户名:dotcpp0731360

访问量:508

签 名:

等  级
排  名 2146
经  验 2432
参赛次数 0
文章发表 12
年  龄 0
在职情况 学生
学  校
专  业 数据科学与大数据技术

  自我简介:

解题思路:    

    题目是想求链表中复数之和,那么我们可以从链表入手,我的思路是:将第二个节点就当作是最后要求和的节点,把第二个节点之后的所有节点的数据都加在这个节点上,最后是输出headNode -> next(即第二个节点)。


   自定义函数实现功能模块化 

        1、创捷链表createList                                            

        2、创建节点createNode                                         

        3、插入节点insertNodeByHead(这里用的是头插入)

        4、复数求和                                                            

        5、链表打印printList                        


参考代码:

#include <stdio.h>
#include <stdlib.h>
 
struct Number{
    int real;        //realPart,实部
    int imagin;      //imerginaryPart,虚部
};
 
struct Node{
    struct Number data;    //数据域
    struct Node* next;     //指针域
};

//创建链表 
struct Node* createList()
{
    struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));    //动态申请内存
    headNode -> next = NULL;
    return headNode;
}

//创建节点
struct Node* createNode(struct Number data)
{
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));    //动态申请内存
    newNode -> data = data;
    newNode -> next = NULL;
    return newNode;
}

//插入节点 
void insertNodeByHead(struct Node* headNode, struct Number data)    //头插法:每次插入节点都是插入在headNode和headNode->next之间
{
    struct Node* newNode = createNode(data);     //调用创建节点函数
    newNode -> next = headNode -> next ;      //新节点指向的下一个是原头节点的下一个
    headNode -> next = newNode;                  //头节点指向的下一个节点是新节点
}
 
//复数求和(我的思路是:直接将第二个节点后面所有节点的数据都加在第二个节点的数据里,最后只打印第二个节点的数据)
void calculataList(struct Node* headNode, struct Number data)
{
    struct Node* pMove = headNode -> next -> next;        //pMove用于遍历第二个节点后面的所哟节点
    while(pMove != NULL)
    {
        struct Node* taotal = headNode -> next;        //total指向headNode -> next, 即第二个节点
        taotal -> data.real += pMove -> data.real;     //第二个节点后面的所有的节点的实部数据都加在total -> data.real里
        taotal -> data.imagin += pMove -> data.imagin; //第二个节点后面的所有的节点的虚部数据都加在total -> data.imagin里
        pMove = pMove -> next;    //每一个节点的实部和虚部数据加完后,pMove不断后移,直到pMove == NULL循环停止
    }
}

//链表打印
void printList(struct Node* headNode, struct Number data)
{
    struct Node* taotal = headNode -> next;
    printf("%d+%di\n", taotal -> data.real, taotal -> data.imagin);    //这里只打印链表中的第二个节点里面的数据,因为所有节点的数据都加在这个节点上了
}
 
int main()
{
    struct Number num;        //临时存放读入的数据
    struct Node* list = createList();    //调用创建链表函数
    int n = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i ++)    //读取数据
    {
        scanf("%d %d", &num.real, &num.imagin);
        insertNodeByHead(list, num);    //调用插入节点函数,每读入一个复数,就要将这个复数存储在节点中,并插入链表
    }
    calculataList(list, num);    //调用复数求和函数
    printList(list, num);        //调用链表打印函数,并检验
    return 0;
}


 

0.0分

1 人评分

  评论区

  • «
  • »