多项式的加法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小时内删除。
发表评论