|
发表于 2014-4-20 19:15:40
|
显示全部楼层
// 1.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>
struct tagNode
{
float coef;
int exp;
struct tagNode *next;
};
typedef struct tagNode Node;
typedef struct tagNode* pNode;
typedef struct tagNode* List;
List Create();
void Print( List L );
void add_poly(Node *pa,Node *pb);
int main()
{
List pa = Create();
List pb = Create();
add_poly( pa, pb );
Print( pa );
getchar();
return 0;
}
List Create()
{
List New = ( List )malloc( sizeof( Node ) );
List P, Q;
New -> next = NULL;
int n;
printf( "输入项数\n" );
Q = New;
scanf( "%d", &n );
for( int i = 0; i < n ; i++ )
{
P = ( pNode )malloc ( sizeof( Node ) );
P -> next = NULL;
scanf( "%f%d" , &( P -> coef ), &( P -> exp ) );
Q -> next = P;
Q = P;
}
return New;
}
void Print( List L )
{
pNode P = L -> next;
while( P -> next != NULL)
{
printf( "%.2fx^%d+", P ->coef, P ->exp);
P = P-> next;
}
printf( "%.2fx^%d", P ->coef, P ->exp);
printf( "\n" );
}
void add_poly(Node *pa,Node *pb)
{
Node *p = pa -> next;//链表1,将来的结果也放在此
Node *q = pb -> next;//链表2
Node *pre=pa;
Node *u;//临时用
float x;
while ( p != NULL && q != NULL )//当两个链表都不为空
{
if (p -> exp < q -> exp )//比较链表1跟链表2当前节点的指数大小,链表1也是存放结果的地方
{
pre = p;
p = p -> next;//p指向要比较的下一个结点。pre指向的是结果链表的最后一个结点。
}
else if ( p -> exp == q -> exp )//假如链表1和链表2的指数相等,就要系数相加
{
x = p -> coef + q -> coef;
if ( x!=0 )//相加后的系数不为0,有必要保留一个结点就可以了
{
p -> coef = x;
pre = p;
}
else//如果相加后,系数是0,不需要保留任何一个结点,在这里删除链表1的结点,下面删除链表2的结点
{
pre -> next = p -> next;//保持链表1的连续性
free( p );
}
p = pre -> next;//p指向要比较的下一个结点
//下面的代码是进行链表2结点的删除工作,因为指数相等,仅仅需要保留一个结点就可以了
//而结果直接保存在链表1中,所以,删除链表2的结点。
u = q;
q = q -> next;
free( u );
}
else//如果链表2的当前节点指数小,那么要把链表2的当前节点加入到结果链表中(即是链表1)
{//相当于把结点插入到链表1中,用u作为临时变量,保存链表2的下一个当前节点的位置。
u = q -> next;
q -> next = p;
pre -> next = q;
pre = q;
q = u;
}
}
if ( q )//如果链表2比链表1长,那么需要把链表2多余的部分加入结果链表中。链表1比链表2长,则什么都不用做。
{
pre -> next = q;
}
free( pb );
}
|
|