題目描述
讀入10個復數,建立對應鏈表,然后求所有復數的和。
輸入格式
無
輸出格式
無
樣例輸入
1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 2 3 3 1 1
樣例輸出
23+23i
代碼功能概述
-
createNode
函數:-
創建一個包含 10 個復數節點的鏈表。
-
每個節點存儲復數的實部 (
real
) 和虛部 (image
)。
-
-
sumNode
函數:-
遍歷鏈表,計算鏈表中所有復數的和。
-
釋放鏈表中的節點內存,并輸出最終的求和結果。
-
-
main
函數:-
調用
createNode
創建鏈表。 -
調用
sumNode
對鏈表中的復數進行求和。
-
代碼解析
1. 頭文件和結構體定義
#include <stdio.h>
#include <stdlib.h>typedef struct Node
{int real;int image;struct Node *next;
} Node;
-
#include <stdio.h>
:包含標準輸入輸出函數(如scanf
和printf
)。 -
#include <stdlib.h>
:包含內存管理函數(如malloc
和free
)。 -
typedef struct Node
:定義了一個鏈表節點結構體Node
,包含:-
real
:存儲復數的實部。 -
image
:存儲復數的虛部。 -
next
:指向下一個節點的指針。
-
2. 創建鏈表函數 (createNode
)
Node *createNode()
{Node *head, *p, *q;head = (Node*)malloc(sizeof(Node)); // 創建頭節點p = head;for (int i = 0; i < 10; i++){q = (Node*)malloc(sizeof(Node)); // 創建新節點scanf("%d%d", &q->real, &q->image); // 輸入實部和虛部q->next = NULL; // 新節點的下一節點初始化為 NULLp->next = q; // 將新節點鏈接到鏈表p = q; // 移動指針到新節點}return head; // 返回鏈表頭指針
}
-
head
:鏈表的頭節點。 -
p
和q
:指針變量,用于遍歷鏈表和創建新節點。 -
循環 10 次:創建 10 個復數節點,每次輸入一個復數的實部和虛部。
-
鏈表鏈接:每個新節點的
next
指向新分配的節點,形成鏈表。
3. 鏈表求和函數 (sumNode
)
void sumNode(Node *head)
{Node *newNode = (Node*)malloc(sizeof(Node));Node *p = head->next; // 從第一個數據節點開始Node *q;newNode->real = 0; // 初始化求和的實部和虛部newNode->image = 0;newNode->next = NULL;while (p != NULL) // 遍歷鏈表{newNode->real += p->real; // 累加實部newNode->image += p->image; // 累加虛部q = p; // 保存當前節點指針p = p->next; // 移動到下一個節點free(q); // 釋放當前節點內存}printf("%d+%di\n", newNode->real, newNode->image); // 輸出求和結果return newNode; // 返回求和節點指針(注意:返回類型不正確,應該是 void)
}
-
newNode
:用于存儲求和結果的新節點。 -
p
:遍歷鏈表的指針,從頭節點的下一個節點開始。 -
while
循環:遍歷鏈表中的每個節點,累加實部和虛部。 -
釋放內存:每次遍歷一個節點時,釋放該節點的內存。
-
輸出結果:以
實部+虛部i
的格式輸出求和結果。
4. 主函數 (main
int main(void)
{Node *head;head = createNode(); // 創建鏈表sumNode(head); // 求和并輸出結果return 0;
}
-
調用
createNode
創建鏈表。 -
調用
sumNode
對鏈表中的復數進行求和并輸出結果。
注意事項
-
內存泄漏:
-
sumNode
函數中釋放了鏈表中的所有節點,但沒有釋放頭節點head
。 -
如果需要完整的內存管理,應在
sumNode
函數中添加對head
的釋放。
-
-
sumNode
的返回值:-
函數聲明的返回類型是
void
,但代碼中返回了newNode
,這會導致編譯錯誤。應移除或注釋掉return newNode;
。
-
-
用戶輸入:
-
如果輸入的復數個數少于 10 個,程序會崩潰。建議添加輸入驗證。
-
示例運行
假設輸入以下 10 個復數:
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
輸出將是:
100+110i
總結
這段代碼實現了一個簡單的鏈表復數求和功能,適合初學者學習鏈表的基本操作。
源代碼
#include <stdio.h>
#include <stdlib.h>typedef struct Node
{int real;int image;struct Node *next;
}Node;Node *createNode()
{Node *head,*p,*q;head = (Node*)malloc (sizeof(Node));p = head;for(int i = 0; i<10; i++){q = (Node*)malloc(sizeof(Node));scanf("%d%d",&q->real,&q->image);q->next = NULL;p->next = q;p = q;}return head;
}void sumNode(Node *head)
{Node *newNode = (Node*)malloc(sizeof(Node));Node *p = head->next;Node *q;newNode->real = 0;newNode->image = 0;newNode->next = NULL;while (p != NULL){newNode->real += p->real;newNode->image += p->image;q = p;p = p->next;free(q);}printf("%d+%di\n",newNode->real,newNode->image);return newNode;
}int main(void)
{Node *head;head = createNode();sumNode(head);return 0;
}