多项式的加法C语⾔体会,⼀个⼀元多项式相加,蕴涵的知识和
编程⼼得
⼀个⼀元多项式相加,蕴涵的知识和编程⼼得
先定义头⽂件t11.h
#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h"  //atoi(),exit();
#include"io.h"      //eof()
#include"math.h"
#define  TRUE  1
#define  FALSE  0
#define  OK  1
#define  ERROR 0
typedef int Status;
typedef int Boolean;
再定义数据结构类型,也包含在头⽂件⾥f1.h
typedef struct Node
{
float num;
int  zs;
struct Node*next;
}node,*linklist;
再就是⾃⼰的实现函数,也是最核⼼的东西,有点乱哈!定义在⽂件feilei.cpp⾥
void initfen(linklist &L)  //初始化程序,分配⼀个头结点空间,但不存数据。
{
L=(linklist)malloc(sizeof(struct Node));
if(!L)
{
printf("内存分配失败!!");
exit(1);
}
}
void ListDelete(linklist &head,int e)  // 删除指定数e的函数{
linklist p1,q1,t1;
q1=head;
t1=p1 = head->next;
if(p1 == NULL)        //链表中⼀个元素也没有。
{
printf("退出!!链表中没有元素");
exit(1);
}
if(p1->next == NULL)  // 第⼀个元素后⽆节点
{
if(p1->num == e)  // 第⼀个节点是要删除的位置
{
free(t1);      // 头结点指针置空
t1=NULL;      // 释放p1
p1=NULL;
printf("表为空⽆数据!!");
exit(1);
}
else
{
printf("\n只有⼀个节点!\n");
}
}
while(p1 != NULL)          //  循环条件
{
if(p1->num == e)      // 当前指针的位置是要删除的节点
{
if(p1->next == NULL)  // 当前位置是最后⼀个节点
q1->next=NULL;    // 将p1当前节点的前⼀个节点的指正置空
free(p1);        // 释放p1
p1=NULL;            //  将p1置空 是为了结束条件循环
}
else              // p1位置是要删除的元素 但p1的下⼀个元素不为空{
q1->next=p1->next;  //  将q1节点的指针指向p1的下⼀个指针free(p1);          //  释放  p1
p1=q1->next;        //  重新将p1指向q1节点的前⼀个
}
}
else  //  p1 当前位置不是要删除的位置
{
q1=q1->next;
p1=p1->next;
}
}
}
void sort(linklist &L)
{
linklist p=L->next,q,r,t,k=L;
q=r=t=p;                //  将指针初始化 指向第⼀个节点,不是头结点if(L->next->next == NULL)  // 只有⼀个节点不满⾜排序
;
else if(L->next == NULL)            //  当链表为空
printf("链表为空⽆数据!!");
else
while(p->next != NULL)    //  采⽤的是p指针标识节点的变化
{
r=t=q=p;            //  重新将指针复位
while(q->next != NULL)    //  循环⽐较,将较⼩的标记下来
{
if(q->next->zs < t->zs)
t=q->next;
r=q;
}
q=q->next;
}
if(t != p)    //  当标识的位置 不是第⼀个节点位置
{
if(t->next == NULL)  //  如果当前位置是最后⼀个节点
{
k->next=t;    //  将链表连接起来
k=k->next;
k->next=NULL;  // 连接来的节点置空
r->next=NULL;  //  原来的节点变成最后⼀个节点
}
else              //  如果是中间的节点数据
{
r->next=t->next;  //  将前⼀个节点以后⼀个节点相连
k->next=t;      //  将排列好的链表接⼊节点
k=k->next;
k->next=NULL;  //  将接⼊来的节点置空
}
}
else              //  是第⼀个节点数据
{
k->next=t;      //  将节点接⼊
k=k->next;      // 指向接⼊的节点
p=t=r=q=p->next;  //  重新调整起始节点位置
k->next=NULL;  // 将接⼊的节点置空
}
if(p->next == NULL)  //  指定的第⼀个节点 为空,则是最后⼀个数据 将其接⼊,break 跳出循环{
k->next=p;
break;
}    //  排序结束
}
void xb(linklist &L)
c语言struct头文件
{
linklist p,q;
q=p=L->next;  // 将p 指向第⼀个节点
q=q->next;    // q指向第⼆个节点
while(q != NULL)  //  q不为空
{
if(p->zs == q->zs)    //  前后两个幂相同,将相加的值存在最前的节点⾥,删除相同幂的节点{
p->num=p->num+q->num;
p->next=q->next;
free(q);
q=p->next;          //  将q重新指向下⼀个
}
else        //  前后不相等
{
p=q;          //  更新指针
q=q->next;
}
}
}
void createlist(linklist &L,char B)  //  创建链表
{
linklist p,q;
char ch;
p=q=(linklist)malloc(sizeof(struct Node));
L->next=p;          // 将头结点与下⼀个节点相链
printf("输⼊%c链表⼀个⼀元多项式的序数和幂:",B);
scanf("%f%d",&p->num,&p->zs);
p->next=NULL;      // 将p1指向的节点指针置空,防⽌⽤户输⼊⼀个节点
printf("是否继续!(y/n):");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。