‘壹’ 数据结构(c语言)用单链表存储一元多项式,并实现两个多项式的相加运算,怎么做
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
/*单项链表的声明*/
typedef struct PolynNode{
int coef; // 系数
int expn; // 指数
struct PolynNode *next; }PolynNode,*PolynList;
/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/
/*指数系数一对一对输入*/ void CreatePolyn(PolynList &L,int n)
{
int i;
下载
原文档已转码为如下格式,以便移动设备查看
数据结构(c语言)用单链表存储一元多项式,并实现两个多项式的相加运算【最新】
阅读:1037次 页数:36页 2016-03-21 举报
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
/*单项链表的声明*/
typedef struct PolynNode{
int coef; // 系数
int expn; // 指数
struct PolynNode *next; }PolynNode,*PolynList;
/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/
/*指数系数一对一对输入*/ void CreatePolyn(PolynList &L,int n)
{
int i;
PolynList p,q;
L=(PolynList)malloc(sizeof(PolynNode)); // 生成头结点
L->next=NULL;
q=L;
printf("成对输入%d个数据 ",n);
for(i=1;i<=n;i++)
{
p=(PolynList)malloc(sizeof(PolynNode));
scanf("%d%d",&p->coef,&p->expn); //指数和系数成对输入
q->next=p;
q=q->next;
}
p->next=NULL;
}
// 初始条件:单链表L已存在
// 操作结果: 依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)) {
PolynList p=L->next;
while(p)
{
vi(p->coef, p->expn);
if(p->next)
{
printf(" + "); //“+”号的输出,最后一项后面没有“+”
}
p=p->next;
}
printf(" ");
}
/*ListTraverse()调用的函数(类型要一致)*/ void visit(ElemType c, ElemType e) {
if(c != 0)
{
printf("%dX^%d",c,e); //格式化输出多项式每一项
}
}
/* 多项式相加,原理:归并 */ /* 参数:两个已经存在的多项式 */ /* 返回值:归并后新的多项式的头结点 */
PolynList MergeList(PolynList La, PolynList Lb) {
PolynList pa, pb, pc, Lc;
pa = La->next;
pb = Lb->next;
Lc = pc = La; // 用La的头结点作为Lc的头结点
while(pa&&pb)
{
if(pa->expn < pb->expn)
{
pc->next = pa; //如果指数不相等,pc指针连上指数小的结
点,
pc = pa;
pa = pa->next; //指向该结点的指针后移
}
else if (pa ->expn > pb->expn )
{
pc->next = pb; //pc指针连上指数小的结点,
pc = pb;
pb = pb->next; //指向该结点的指针后移
}
else //(pa ->expn = pb->expn )
{
pa->coef = pa->coef + pb->coef; //指数相等时,系数相加
pc->next = pa;
pc = pa;
pa = pa->next; //两指针都往后移
pb = pb->next;
}
}
pc->next = pa ? pa:pb; // 插入剩余段
return Lc;
}
void main()
{
PolynList ha,hb,hc;
printf("非递减输入多项式ha, ");
CreatePolyn(ha,5); // 正位序输入n个元素的值
printf("非递减输入多项式hb, ");
CreatePolyn(hb,5); // 正位序输入n个元素的值
‘贰’ 数据结构线性表的单链表存储结构
线性表是一种数据元素有序的逻辑结构,通常采用顺序存储结构和链式存储结构。线性表采用顺序存储结构时,有利用线性表长度的计算、线性表数据元素的存取和数据元素的遍历,同时也从物理结构上反映了线性表数据元素的逻辑结构,有点类似于c语言中的数组,但是采用顺序存储结构时,插入和删除数据元素时,要移动较多的数据元素;采用链表结构存储的线性表,克服了插入和删除数据元素时要移动较多元素的缺点,其只要寻找到需要插入和删除的数据元素处,处理相应的指针就可以实现数据元素的插入和删除,同时也和顺序存储的线性表一样方便遍历,但是其不利于计算线性表的长度,线性表的链表存储结构有以下几种常见类型:采用带头指针和头结点的单链表、采用仅带头指针的单链表、带头指针和头结点的循环链表、带头指针和尾结点的循环链表、双向链表等形式。在实际应用中,结合顺序表易于计算表长和链表易于插入和删除的特点,实际一般采用两者结合的一种单链表,其链表类型为带有头指针(含头结点)和尾指针,以及含有线性表长度的分量,在一元多项式的运算中采用的就是这种链式存储结构。此外,还有一种一般应用于无指针的高级语言中的静态单链表的存储结构。
‘叁’ C语言中链表的存储、读取、修改问题
1、链表存到文件中去后,再取出来是不是要再次对各个元素进行链表的关联(就是下一个元素地址赋予前一个元素中的地址变量中)?有没有更简单的方法让其自动恢复原先的链表关系?
答:链表的关系的却需要重新建立,没有别的方法,这里只需要重新设置,因为链表是存储在内存中的,每次malloc出来的指针地址不一致,无法存储到文件中,下次继续使用。
2、编辑前,是否需要将整个文件流从文件中都读取至堆里去,连立成一个链表?如果文件很大,大过内存怎么办?
答:文件中存储的是整个链表的信息,你只需要每次读出一个struct就可以了。这个malloc出来的struct中你需要读取一个index的值,然后以这个index的值再建立一个链表,将原来那个malloc出来的struct可以释放,这样就可以不用担心文件很大,怕内存不足的情况。因为即使你的链表再长,一个int值足以表示。如果怕int(4字节)不够,可以用double类型,甚至可以用链表嵌套。
3、如果整个文件都读出至堆中,并关联成了链表,那么修改后用fwrite()再次保存至文件中时,是不是把原来的记录都覆盖了还是在后面追求啊?
答:这里写文件就看你自己是怎么打开文件了。(存储的时候是不是按照struct大小存储还是按照实际数据大小存储)最好的方式是可以随便修改,这种方式最难,因为要考虑到更改的是第几个字节。最简单的方式,直接将文件删除,重新建立,但是这样就必须要将所有数据读取到内存中。
如果你要实现问题2中的方法,则问题3即要做大量的修改。
‘肆’ C语言如何用动态链表储存数据
单链表,双链表,堆
都可以,不过看您要存储什么数据
以单链表为例:
定义一个节点结构
typedef
struct
LNode{
ElementType
date;
struct
Lnode
*next;
}Lnode;
然后用malloc开辟需要的节点空间,把数据存进去就可以了
p
=
(Lnode)
malloc
(sizeof(Lnode));
//开辟一个节点,p为所开辟空间的指针
至于查找,从头节点开始q
=
p->next
;一个个查就行了。
‘伍’ C语言的链表数据如何保存在文件中
可以将链表的结构按顺序读出来存放在文件中,在家载的时候读文件然后重新生成链表结构就可以了
‘陆’ C语言中如何将一个链表保存为文件
第一步:创建文件 比如说 file *fp=fopen(……);
第二步:写一个循环,把链表的节点一个一个写进文件里。
第三部:记得关闭文件- -
‘柒’ C语言中怎样用链表保存结构体数据(动态数据结构)
链表有多种形式,如:单向链表,双向链表,单向循环链表,双向循环链表。将链表结构定义为list_t,则该类型中一定(至少)存在一个指向下一节点的指针list_t
*next;除了这个指针,list_t
中可以包含其它类型的数据,包括结构体变量。比如:typedef
struct
{
struct
usr_struct
data;
list_t
*next;
}
list_t;
‘捌’ 关于C语言中,链表数据的文件储存和提取。
当把链表已经确定的时候,就可以依次存入文件。
和平时链表的遍历一样,每读取一个节点内容就进行一次存入操作。
不过要注意几个部分的检查:
内存空间是否分配成功
是否成功存入到文件中
在工作完成之后,是否将以后不会用到的变量清空和删除。
按照问题要求的代码如下:
Consumer*read_list()
{
FILE*fp;
if((fp=fopen("CONSUMER.dat","rb"))==NULL)
{
printf("无法读取CONSUMER.dat ");
returnNULL;
}
intsign;
Consumer*s,*p,*head;
head=(Consumer*)malloc(SIZE_C);
if(head==NULL)
{
printf("读取失败!内存空间申请不足! ");
returnNULL;
}
fseek(fp,0,SEEK_END);
if(ftell(fp)==0)
{
returnNULL;
}
p=head;
p->next=NULL;
while(feof(fp))
{
s=(Consumer*)malloc(SIZE_C);
//fread(s,SIZE_C,1,fp);
fread(s,sizeof(char),SIZE_C,fp);
p->next=s;
p=s;
p->next=NULL;
}
fclose(fp);
returnhead;
}//读取文件到链表
intsave_consumer(Consumer*p)
{
FILE*fp;
Consumer*head;
head=p;//p为已经构建好的链表
//if((fp=fopen("CONSUMER.dat","ab+"))==NULL)
if((fp=fopen("CONSUMER.dat","wb"))==NULL)
{
printf("无法打开CONSUMER.dat! ");
return-1;
}
while(p!=NULL)
{
//fwrite(p,SIZE_C,1,fp);
fwrite(p,sizeof(char),SIZE_C,fp);
p=p->next;
}
fclose(fp);
return1;
}//储存链表到文件
‘玖’ 单链表存储结构的C语言定义是具体是指什么
数据的存储方式有两种,顺序存储和链式存储,当然单链表也是链式存储中的一种,单链表存储结构的c语言定义应该是用c语言去描述一个单链表。