1. 程式人生 > >多項式加法,單鏈表

多項式加法,單鏈表

下一個 continue def 不存在 stdlib.h tlist nod 交換 遍歷


#include "stdio.h"
#include<stdlib.h>
#define length sizeof(struct node)

typedef struct node
{
float coef; //系數
int expn; //指數
struct node *next;
} Test;

Test *head, *p, *q, *r,*s;//定義遍歷指針

//帶有頭結點的鏈表
Test *Create()//這是一個具有頭結點的鏈表
{
int List_Size;
head = (Test *)malloc(length); //首先創建一個頭結點
p = head; //用遍歷指針先指向頭結點

p->next = (Test *)malloc(length);
p = p->next;
printf("請輸入多項式的長度:");
scanf("%d", &List_Size);

if (List_Size>0)
{
for (int i = 1; i<List_Size; i++)
{
p->next = (Test *)malloc(length);
p = p->next;
}
p->next = NULL;
return head;
}
else
{
printf("鏈表的長度必須大於0\n");
}
return head;
}

void InitList(Test *List_Head)//初始化鏈表
{
if (List_Head->next != NULL)
{
p = List_Head->next;
while (p != NULL)
{
printf("請輸入系數,指數:");
scanf("%f,%d", &p->coef,&p->expn);
p = p->next;
}
}
else
{
printf("鏈表為空,無法初始化\n");
}
}

int ListLength(Test *List_Head)
{
int List_Length = 0;
if (List_Head->next != NULL)
{
p = List_Head->next;
while (p != NULL)
{
if (p->coef != 0) {
List_Length++;
} //系數不等於0 長度+1
p = p->next;
}
}
else
{
printf("鏈表為空,長度為0");
}
return List_Length;
}

void ListSort(Test *List_Head)//排序 由小到大
{
if (List_Head->next != NULL)
{
q = p = List_Head->next;//指向頭結點後的第一個結點
int temp; float temp1;
while (q->next != NULL)
{
while (p->next != NULL)
{
p = p->next;
if (q->expn > p->expn)
{
temp = q->expn;
q->expn = p->expn;
p->expn = temp; //交換系數

temp1 = q->coef;
q->coef = p->coef;
p->coef = temp1; //交換指數
}
}//循環一次 最小的被交換到前面
q = q->next;//指針向後推一個 繼續排後面的
p = q;
}
}
else
{
printf("鏈表為空,無法排序");
}
}
void Display(Test *List_Head)
{
if (List_Head->next != NULL)
{

int List_Length;
List_Length = ListLength(List_Head);//得到多項式的長度

printf("F=");
p = List_Head->next;


while (p != NULL)
{
if (List_Length == 0) { //如果多項式長度為零 輸出0 跳出循環
printf("0");
break;
}
if (p->coef == 0) {
p = p->next;
continue;
} //如果系數為0不輸出 跳到下一個
if (p->coef<0) {
printf("(%2.2fX^%d)", p->coef, p->expn);
}
else {
printf("%2.2fX^%d", p->coef, p->expn);
}
if (p->next != NULL) {
printf("+");
} //是最後一個的話就不輸出+
p = p->next;
}
printf("\n");
}
else
{
printf("鏈表為空,無法展示\n");
}

printf("\n");
}

Test *mergeList(Test *f1, Test *f2) {
p = f1->next; q = f2->next;
while (p->next!= NULL) {
p = p->next;
}
p->next = q;
head = f1;
return head;
}

void addPolyn(Test *f1,Test *f2) {
head = f1;p = f1->next; q = f2->next;
while (q!=NULL) {
p = f1->next; //每次都將指針指向A的第一項
int flag = 0; //B多項式每後移一項都賦flag為0
while (p!=NULL){
if (p->expn==q->expn) {
flag = 1; //做為後面是插入還是系數相加的判斷條件
s = p; //多項式A裏面要是有與當前多項是B中的一個指數相同的話 用s保存下來
}
p = p->next;
}
if (flag == 1) { //如果A中存在與B中當前一項系數相同的項
s->coef = s->coef + q->coef; //將相同系數的項指數相加
}
else { //如果不存在
r = (Test *)malloc(length); //將當前項復制到一塊新的結構體中
r->coef = q->coef;
r->expn = q->expn;

r->next = head->next; //將B當前項插入A中
head->next = r;
}
q = q->next; //進行B的下一項的判斷
}

ListSort(f1);//輸入隨機 有序無序都可以
}

void addPolyn1(Test *f1, Test *f2) {
head = mergeList(f1, f2); //連接鏈表
ListSort(head); //從小到大排序
p = head->next; //從頭結點後的項開始
q = p;
while (p->next!=NULL) {
q = p; //每一次都是兩個挨著的項進行判斷
if (p->expn==q->next->expn) { //如果該項和後一項指數值相等
p->coef = p->coef + q->next->coef; //系數相加

r = q->next; //用一個指針指向後面的一項
p->next = r->next; //跨過後面的一項
}
else {
p = p->next; //如果該項和後面一項指數不相等 將指針後移一位 繼續判斷
}
}
}

void subPolyn(Test *f1,Test *f2) {
p = f1->next; q = f2->next;
while (q!= NULL) { //將B中的每一項的系數變為負的
q->coef=-q->coef;
q = q->next;
}
addPolyn(f1, f2); //再進行相加
}

void subPolyn1(Test *f1,Test *f2) {
p = f1->next; q = f2->next;
while (q != NULL) { //將B中的每一項的系數變為負的
q->coef = -q->coef;
q = q->next;
}

addPolyn1(f1, f2);
}

int main()
{
Test *List_A, *List_B;
List_A = Create();
InitList(List_A);
Display(List_A);

List_B = Create();
InitList(List_B);
Display(List_B);

addPolyn(List_A,List_B);
//addPolyn1(List_A, List_B);
//subPolyn(List_A, List_B);
//subPolyn1(List_A, List_B);
Display(List_A);
}

還有點點問題。

多項式加法,單鏈表