『壹』 數據結構(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語言去描述一個單鏈表。