C语言线性链表实现一元多项式的加法(不包含乘法)

it2023-07-11  67

IDE:Visual Studio 2019 声明:为了方便书写代码,用到了C++的引用调用特性和iostream作为输入输出,读者可以使用指针调用和scanf_s和print语句实现相同效果 tips:如果只是为了实现函数,很多方程式不需要写得,我感觉debug中最经常出现的错误就是尾指针->next没有指向NULL导致的。有疑问可以在下面交流,我会尽量回复的

头文件heads.h

#pragma once #include "stdio.h" #include "iostream" #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 typedef int Status; using namespace std; typedef struct{//指数和系数 float coef; int expn; }term,ElemType; typedef struct LNode { ElemType data; struct LNode* next; }*Link,*Position; typedef struct { Link head, tail; int length; }LinkList;

头文件functions.h

#include "head.h" //创建结点,用e赋值 Status MakeNode(Link& p, ElemType e) { p = (Link)malloc(sizeof(LNode)); if (!p)return ERROR; p->data = e; p->next = NULL; return OK; } //销毁结点 void FreeNode(Link* p) { free(*p); *p = NULL; } //判空 bool Empty(LinkList L) { if (L.length == 0)return TRUE; return FALSE; } //visit Status visit(ElemType e) { if (e.coef > 0 && e.coef != 1 && e.expn != 0) { if (e.expn > 0) cout << e.coef << "X^" << e.expn ; else cout << e.coef << "X^(" << e.expn << ")"; } else if (e.coef < 0 && e.expn != 0) { if (e.expn > 0) cout << "(" << e.coef << ")X^" << e.expn ; else cout << "(" << e.coef << ")X^(" << e.expn << ")"; } else if (e.coef == 1 && e.expn != 0) { if (e.expn > 0) cout << "X^" << e.expn ; else cout << "X^(" << e.expn << ")"; } else if (e.expn == 0 && e.coef != 0) cout << e.coef << "+"; else cout << "";//考虑用户输入可能有系数为0的情况,情况太多,避免万一 return OK; } //创建空链表 Status Inislist(LinkList& L) { Link p = (Link)malloc(sizeof(LNode)); if (!p)return ERROR; L.head = p; L.tail = p; p->next = NULL; L.length = 0; return OK; } //置空链表 Status Clearlist(LinkList& L) { Link p = L.head->next,q; if (!p) return ERROR; while (p) { q = p; p = p->next; FreeNode(&q); } L.tail = L.head; L.length = 0; return OK; } //摧毁链表 Status Destory(LinkList& L) { Clearlist(L); FreeNode(&L.head); return OK; } //删除线性链表的头结点的下一个结点 Status DelFirst(LinkList& L, Link& q) {//用不到的函数 Link p = L.head; if (!p->next) return ERROR; q = p->next; if (!q->next) { L.tail = p; } else { p->next = q->next; } L.length--; return OK; } //头结点后第一个结点前插入一个结点S Status InsFirst(LinkList& L, Link S) {//用不到的函数 Link p = L.head; if (!p->next) { p->next = S; L.tail = S; } else { S->next = p->next; p->next = S; } L.length++; return OK; } //在L的末尾衔接上s所链接的一串结点 Status Append(LinkList& L, Link s) { L.tail->next = s; L.length++; while (s->next) { s = s->next; L.length++; } L.tail = s; L.tail->next = NULL; return OK; } // Status InsLast(LinkList& L,Link s) { L.tail->next = s; L.length++; L.tail = s; s->next = NULL; return OK; } //头结点的下一个结点插入 Status Insfirst(LinkList& L, Link& h, Link& s) {//用不到的函数 s->next = h->next; h->next = s; if (!s->next)L.tail = s; L.length++; return OK; } //删除尾结点并更新L的尾结点 Status Remove(LinkList& L, Link& q) { if (L.head = L.tail)return ERROR; Link p = L.head; q = L.tail; while (p->next!=q) { p = p->next; } L.tail = p; p->next = NULL; return OK; } //创建一元多次方程组 Status Create(LinkList& L) { Link q; float a; int b; Inislist(L); cin >> a; while (a) {//系数输入0时终止链表的建立 cin >> b; ElemType e; e.coef = a; e.expn = b; MakeNode(q, e); cin >> a; InsLast(L, q); } return OK; } //遍历链表 Status Traverse(LinkList L, Status(*visit)(ElemType)) { Link p = L.head->next; if (L.length == 0)cout << "0"; while (p){ visit(p->data); p = p->next; if (p)cout << "+"; } cout << endl; return OK; } Status Compare(Link p, Link q) { if (p->data.expn > q->data.expn)return 1; if (p->data.expn == q->data.expn)return 0; if (p->data.expn < q->data.expn)return -1; return OK; } Status AddPoly(LinkList& P, LinkList& Q) { Link p = P.head, q = Q.head, pa = p->next, qa = q->next; if (P.length == 0 && Q.length == 0)return ERROR; while (pa && qa) { switch (Compare(pa, qa)) { float sum; case -1: pa = pa->next; p = p->next; break; case 0: sum = pa->data.coef + qa->data.coef; q->next = qa->next; if (sum != 0) { pa->data.coef = sum; } else { p->next = pa->next; FreeNode(&pa); pa = pa->next; P.length--; } FreeNode(&qa); qa = q->next; Q.length--; break; case 1: q->next = qa->next; p->next = qa; qa->next = pa; qa = q->next; p = p->next; P.length++; Q.length--; break; } } if (qa) { q->next = NULL; Append(P, qa); } Q.tail = q; Destory(Q); return OK; }

调用文件main.cpp

#include "head.h" #include "functions.h" int main(void) { LinkList L,M; Create(L); Traverse(L, visit); Create(M); Traverse(M, visit); AddPoly(L, M); Traverse(L,visit); }
最新回复(0)