您的位置:首页 > 理论基础 > 数据结构算法

链表表示的 一元多项式,无参构造器,有参构造器,相加,遍历

2017-03-24 15:44 363 查看
//链表表示的 一元多项式,无参构造器,有参构造器,相加,遍历
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define TRUE 1
#define ERROR -1
#define FALSE -1
#define OVERFLOW -2
typedef int Status;
#define LEN sizeof(Node)
#define MLC (Node*)malloc(sizeof(Node))
//-------链表表示的 一元多项式 --------------
typedef struct PNode {
float coef;        //系数 data域
int expn;        //指数 data域
PNode* next;     //引用 ptr域
int(*Length)(PList L); //长度
PNode*(*MakeNode)(PNode* polyElem); //无参构造器, 用函数指针实现 成员函数
PNode*(*SetCurItemValue)(); //有参构造器,设置工作节点data value
void(*CreatePloyn)(PList L, int length); //建立链表
}PNode, *PList;

//无参构造器,在c语言里面实现构造器,赋值语句,
PNode* MakeNode() {
PNode* head = (PNode*)malloc(sizeof(PNode));
if (!head)  /* 存储分配失败 */
exit(OVERFLOW);
coef = 0.0;//赋值语句 默认值
expn = 0;
next = NULL;
return head;
}

//有参构造器,建立有值的多项式链表
void CreateValuePloyn(PList p, int length) {
PList e = PList.MakeNode();//无参构造器
for (int i = 0; i < length; i++) {
scanf("%i,%i", &e->coef, &e->expn); //赋值,系数,指数    //输入各项的系数和指数,建立一元多项式的有序链表p
}
}

/* 将值为data的结点插入到head链表的最后 */ // AppendByInstanseNode
void AppendNode(PNode *head, double coef, int exp) {
PNode* pre = head->next;
PNode* temp; //tempNode*
temp = (PNode*)malloc(sizeof(PNode));
temp->coef = coef;
temp->exp = exp;
temp->next = NULL;

if (pre == NULL) {
head->next = temp;
return;
}
for (; pre->next != NULL; pre = pre->next);
pre->next = temp;
}

//多项式节点的加法
PNode* Add(PNode *headA, PNode *headB) {
PNode *currA, *currB, *headC;
double sum;
currA = headA->next;
currB = headB->next;
headC = Init();
while (currA != NULL && currB != NULL) {
if (currA->exp > currB->exp) {
AppendNode(headC, currA->coef, currA->exp);
currA = currA->next;
} else if (currA->exp < currB->exp) {
AppendNode(headC, currB->coef, currB->exp);
currB = currB->next;
} else {
sum = currA->coef + currB->coef;
if (sum != 0) {
AppendNode(headC, sum, currA->exp);
}
currA = currA->next;
currB = currB->next;
}
}
while (currA != NULL) {
AppendNode(headC, currA->coef, currA->exp);
currA = currA->next;
}
while (currB != NULL) {
AppendNode(headC, currB->coef, currB->exp);
currB = currB->next;
}
return headC;
}

/* 返回head链表的所有结点的数量 */
int Size(PNode *head) {
int len = 0;
PNode *curr;
for (curr = head->next; curr != NULL; curr = curr->next, len++);
return len;
}

//访问结点输出
Status visit(PList p) {
printf("(%lf, %d)\t", p->coef, p->expn);
return TRUE;
}

//遍历链表输出 :依次对L的每个元素调用visit()
void ListTraverse(PList L, void(*visit)(PNode)) {
/* 依次对L的每个元素调用vi(),打印输出语句*/
PList p;  //temp ptr
p = L->next; //pass the head node
printf("All nodes's values are : ");
while (p != NULL) {
visit(p); //visit and print
p = p->next;
}
printf("\n");
}

//主函数
void main() {
PNode *headA, *headB, *headC;
headA = Init();
headB = Init();
AppendNode(headA, 1.0, 5);
AppendNode(headA, -1.0, 3);
AppendNode(headA, 1, 0);
AppendNode(headB, 0.5, 5);
AppendNode(headB, 1.0, 4);
AppendNode(headB, 1.0, 3);
ListTraverse(headA);
ListTraverse(headB);
headC = Add(headA, headB);
ListTraverse(headC);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息