歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實現(xiàn)C語言

  • 資源ID:76430011       資源大?。?span id="xlx0c9c" class="font-tahoma">382KB        全文頁數(shù):51頁
  • 資源格式: DOC        下載積分:50積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要50積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認(rèn)打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。

清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實現(xiàn)C語言

/* cl.h (程序名)*/#in elude<stri ng.h>#in elude#in elude#in elude<ctype.h>vmalloc .h> /* malloc() 等 */* INT MAX等 */<limits.h>#in clude<stdio.h>/* EOF(=AZ 或 F6),NULL */#in clude<stdlib.h>#in clude#in clude/* atoi() */<io.h> /* eof() */<math.h> /* floor(),ceil(),abs() */#in clude<process.h> /* exit() */*函數(shù)結(jié)果狀態(tài)代碼*/ #defi ne TRUE 1#defi ne FALSE 0#defi ne OK 1#defi ne ERROR 0#defi ne INFEASIBLE -1/* #define OVERFLOW -2因為在 math.h中已定義 OVERFLO的值為3,故去掉此行*/typedef int Status ; /* Status 是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等*/typedef int Boolean ; /* Boolean 是布爾類型,其值是 TRUE或 FALSE */* algo2-1.c實現(xiàn)算法2.1的程序*/#include "cl.h"typedef intElemType;#include "c2-1.h"/*c2-1.h線性表的動態(tài)分配順序存儲結(jié)構(gòu)*/#define LIST_INIT_SIZE 10 /*線性表存儲空間的初始分配量*/#define LISTINCREMENT 2/* 線性表存儲空間的分配增量*/typedef structElemType *elem; /* 存儲空間基址 */int length ; /* 當(dāng)前長度 */int listsize ; /* 當(dāng)前分配的存儲容量 (以sizeof( ElemType)為單位)*/ SqList ;#include "bo2-1.c"/* bo2-1.c順序表示的線性表(存儲結(jié)構(gòu)由c2-1.h定義)的基本操作(12個)*/Status InitList (SqList *L) /* 算法 2.3 */ /*操作結(jié)果:構(gòu)造一個空的順序線性表*/(*L). elem=( ElemType*) malloc (LIST_INIT_SIZE *sizeof ( ElemType);if (!( *L). elem)exit (OVERFLOW);/* 存儲分配失敗 */(*L). length =0; /* 空表長度為 0 */(*L). listsize =LIST_INIT_SIZE ; /* 初始存儲容量 */ return OK;Status DestroyList (SqList*L) /*初始條件:順序線性表L已存在。操作結(jié)果:銷毀順序線性表L */free( *L). elem);(*L). elem=NULL;(*L). length =0;(*L). listsize =0; return OK;Status ClearList (SqList *L) /*初始條件:順序線性表L已存在。操作結(jié)果:將L重置為空表*/(*L). length =0;return OK;Status ListEmpty (SqListL) /*初始條件:順序線性表L已存在。操作結(jié)果:若L為空表,則返回 TRUE否則返回FALSE */if (L. length =0)return TRUE;elsereturn FALSE;int List Length (SqList L) /*初始條件:順序線性表L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個數(shù)*/return L. length ;Status Get Elem( SqList L, int i, ElemType *e) /*初始條件:順序線性表L已存在,1 < i w ListLength(L) */*操作結(jié)果:用e返回L中第i個數(shù)據(jù)元素的值*/if (i<1|i>L. length )exit (ERROR);*e=*(L. elem+i-1);return OK;int Locate Elem( SqList L, ElemType e, Status (*compare)( ElemType, ElemType) /*初始條件:順序線性表L已存在,compare()是數(shù)據(jù)元素判定函數(shù)(滿足為1,否則為0) */*操作結(jié)果:返回L中第1個與e滿足關(guān)系compare()的數(shù)據(jù)元素的位序。*/*若這樣的數(shù)據(jù)元素不存在,則返回值為0。算法2.6 */ElemType *p;int i=1; /* i的初值為第1個元素的位序*/p=L. elem; /* p的初值為第1個元素的存儲位置*/while (i<=L. length &&!compare(*p+,e)+i;if (i<=L. length )return i;elsereturn 0;Status Prior Elem( SqList L, ElemType cur_e, ElemType *pre_e) /*初始條件:順序線性表L已存在*/*操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是第一個,則用pre_e返回它的前驅(qū),*/ /*否則操作失敗,pre_e無定義*/int i=2;ElemType *p=L. elem+1;while (i<=L. length &&*p!=cur_e)p+;i+;if (i>L. length )return INFEASIBLE;else*pre_e=*-p;return OK;Status Next Elem(SqList L, ElemType cur_e, ElemType *next_e) /*初始條件:順序線性表L已存在*/*操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是最后一個,則用next_e返回它的后繼, */*否則操作失敗,next_e無定義*/int i=1;ElemType *p=L. elem;while (i<L. length &&*p!=cur_e)i+;p+;if (i=L. length )return INFEASIBLE;else*n ext_e=*+p;return OK;Status List In sert(SqList *L, i nt i, ElemType e) /* 算法 2.4 */ /*初始條件:順序線性表L已存在,1 < i < ListLength(L)+1 */*操作結(jié)果:在L中第i個位置之前插入新的數(shù)據(jù)元素e, L的長度加1 */ElemType *n ewbase,*q,*p;if (i<1|i>(*L). length +1) /* i值不合法 */return ERROR;if ( *L). length >=(*L). listsize ) /*當(dāng)前存儲空間已滿,增加分配*/n ewbase=( ElemType*)realloc( *L). elem,( *L). listsize +LISTINCREMENT)Sizeof (ElemType);if (!newbase)exit (OVERFLOW); /* 存儲分配失敗 */(*L). elem =newbase; /* 新基址 */(*L). listsize +=LISTINCREMENT;/* 增加存儲容量 */q=( *L). elem+i-1; /* q 為插入位置 */for (p=( *L). elem+(*L). length -1;p>=q;-p)/* 插入位置及之后的元素右移*/*(p+1)=*p;*q=e;/* 插入 e */+( *L). length ; /* 表長增 1 */return OK;Status ListDelete( SqList *L, int i, ElemType *e)/* 算法 2.5 */ /*初始條件:順序線性表L已存在,1 < i < ListLength(L) */*操作結(jié)果:刪除L的第i個數(shù)據(jù)元素,并用e返回其值,L的長度減1 */ElemType *p,*q;if (i<1|i>(*L). length ) /* i值不合法 */return ERROR;p=( *L). elem+i-1; /* p為被刪除元素的位置 */*e=*p;/*被刪除元素的值賦給 e */q=( *L). elem+(*L). length -1;/* 表尾元素的位置 */for什+p;p<=q;+p)/*被刪除元素之后的元素左移*/*(p-1)=*p;(*L). length -;/* 表長減 1 */return OK;Status ListTraverse( SqList L,void(*vi)( ElemType*) /*初始條件:順序線性表L已存在*/*操作結(jié)果:依次對L的每個數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,則操作失敗*/* vi()的形參加& ,表明可通過調(diào)用 vi()改變元素的值*/ElemType *p;int i;p=L. elem;for (i=1;i<=L.length ;i+)vi(p+);pr int f("n");return OK;Status equal( ElemType c1, ElemType c2) /*判斷是否相等的函數(shù),Union()用到*/if (c1=c2)return TRUE;elsereturn FALSE;void Union( SqList *La, SqList Lb) /* 算法 2.1 */ /*將所有在線性表Lb中但不在La中的數(shù)據(jù)元素插入到La中*/ElemType e;int La_len,Lb_len;int i;La_len=ListLength (*L a); /* 求線性表的長度 */Lb_len=ListLength (Lb);for (i=1;i<=Lb_len;i+)GetElem(Lb,i,&e);/*取Lb中第i個數(shù)據(jù)元素賦給 e */if (!Locate Elem( *La,e,equal) /* La 中不存在和e相同的元素,則插入之*/ ListI nsert(La,+La_le n, e);void pr int (ElemType *c)pr int f("%d ",*c);void mai n()SqList La,Lb;Status i;int j;i= In itList (&La);if (i=1)/* 創(chuàng)建空表 La成功*/for (j=1;j<=5;j+)/*在表La中插入5個元素*/i=List In sert(&La,j,j);pr int f("La= ");/* 輸出表 La 的內(nèi)容 */ListTraverse(La,print );InitList(&Lb); /*也可不判斷是否創(chuàng)建成功*/for (j=1;j<=5;j+)/* 在表Lb中插入5個元素*/i=ListI nsert(&Lb,j,2*j);pr int f("Lb= ");/* 輸出表 Lb 的內(nèi)容 */ListTraverse(Lb,pr int );Un io n(&La,Lb);pr int f("new La= ");/* 輸出新表 La 的內(nèi)容 */ListTraverse(La,print );/* algo2-2.c實現(xiàn)算法 22的程序*/#include "cl.h"typedef intElemType;#include "c2-1.h"#include "bo2-1.c" void MergeList( SqList La, SqList Lb, SqList *Lc) /* 算法 2.2 */ /*已知線性表La和Lb中的數(shù)據(jù)元素按值非遞減排列。*/*歸并La和Lb得到新的線性表 Lc,Lc的數(shù)據(jù)元素也按值非遞減排列*/int i=1,j=1,k=O;int La_len,Lb_len;ElemType ai,bj;InitList (Lc);/* 創(chuàng)建空表 Lc */La_len=ListLength (La);Lb_len=ListLength (Lb);while (i<=La_len&&j<=Lb_len)/* 表 La 和表 Lb 均非空 */GetElem(La,i, &ai);GetElem(Lb,j, &bj);if (ai<=bj)List In sert(Lc,+k,ai);+i;elseListI nsert(Lc,+k,bj);+j;while (i<=La_len)/* 表 La 非空且表 Lb 空 */Get Elem(La,i+, &ai);List In sert(Lc,+k,ai);while (j<=Lb_len)/* 表 Lb 非空且表 La 空 */Get Elem(Lb,j+, &bj);ListI nsert(Lc,+k,bj);void pr int (ElemType *c)pr int f("%d ",*c);void mai n()SqList La,Lb,Lc;int j,a4=3,5,8,11,b7=2,6,8,9,11,15,20;In itList(&La);/*創(chuàng)建空表La */for (j=1;j<=4;j+)/*在表La中插入4個兀素*/ListI nsert(&La,j,aj-1);pr int f("La=");/*輸出表La的內(nèi)容*/ListTraverse(La,print );In itList(&Lb);/*創(chuàng)建空表Lb */for (j=1;j<=7;j+)/* 在表Lb中插入7個元素*/ListI nsert(&Lb,j,bj-1);pr int f("Lb= ");/* 輸出表 Lb 的內(nèi)容 */ListTraverse(Lb,pr int );MergeList(La,Lb,&Lc);pr int f("Lc= ");/* 輸出表 Lc 的內(nèi)容 */ListTraverse(Lc,pr int );/* algo2-3.c實現(xiàn)算法2.7的程序*/#include "cl.h"typedef intElemType;#include "c2-1.h"#include "bo2-1.c"void MergeList( SqList La, SqList Lb, SqList *Lc) /* 算法 2.7 */ /*已知順序線性表 La和Lb的元素按值非遞減排列。*/*歸并La和Lb得到新的順序線性表Lc,Lc的元素也按值非遞減排列*/ElemType *pa,*pa_last,*pb,*pb_last,*pc;pa=La. elem;pb=Lb. elem;Lc(*Lc). listsize =(*Lc). length =La. length +Lb. length ; /* 不用 InitList()創(chuàng)建空表*/pc=( *Lc). elem =( ElemType *) malloc ( *Lc). listsize * sizeof (ElemType);if (!( *Lc). elem) /* 存儲分配失敗 */exit (OVERFLOW);pa_last=La.elem+La. length -1;pb_last=Lb.elem+Lb. length -1;while (pa<=pa_last&&pb<=pb_last)/* 表 La 和表 Lb 均非空 */*歸并*/if (*pa<=*pb)*pc+=*pa+;else*pc+=*pb+;while (pa<=pa_last)*pc+=*pa+;/*while (pb<=pb_last)*pc+=*pb+;/*/*表La非空且表Lb空*/ 插入La的剩余元素*/* 表Lb非空且表 La空*/插入Lb的剩余元素*/void pr int (ElemType *c)pr int f("%d ",*c);void mai n()SqList La,Lb,Lc;int j;InitList(&La);/* 創(chuàng)建空表 La */for (j=1;j<=5;j+)/* 在表La中插入5個元素*/ListI nsert (&La,j,j);pr int f("La= ");/* 輸出表 La 的內(nèi)容 */ListTraverse(La,print );InitList(&Lb);/* 創(chuàng)建空表 Lb */for (j=1;j<=5;j+)/* 在表Lb中插入5個元素*/ListI nsert(&Lb,j,2*j);pr int f("Lb= ");/* 輸出表 Lb 的內(nèi)容 */ListTraverse(Lb,pr int );MergeList(La,Lb,&Lc);pr int f("Lc= ");/* 輸出表 Lc 的內(nèi)容 */ListTraverse(Lc,pr int );/* algo2-4.c 修改算法2.7的第一個循環(huán)語句中的條件語句為開關(guān)語句,且當(dāng) */ /* *pa=*pb 時,只將兩者中之一插入Lc。此操作的結(jié)果和算法2.1相同*/#include "c1.h" typedef int ElemType;#include "c2-1.h"#include "bo2-1.c"int comp( ElemType c1, ElemType c2) int i;if (c1<c2)i=1;else if (c1=c2)i=0;elsei=-1;return i;void MergeList( SqList La, SqList Lb, SqList *Lc) /*另一種合并線性表的方法(根據(jù)算法2.7下的要求修改算法 2.7 ) */ElemType *pa,*pa_last,*pb,*pb_last,*pc;pa=La. elem;pb=Lb. elem;(*Lc). listsize =La. length +Lb. length ; /* 此句與算法 2.7 不同 */pc=( *Lc). elem =( ElemType *) malloc ( *Lc). listsize * sizeof (ElemType); if (!( *Lc). elem)exit (OVERFLOW);pa_last=La.elem+La. length -1;pb_last=Lb.elem+Lb. length -1;while (pa<=pa_last&&pb<=pb_last)/* 表 La 和表 Lb 均非空 */switch(comp(*pa,*pb)/* 此句與算法 2.7 不同 */case 0: pb+;case 1:*pc+=*pa+;break;case -1:*pc+=*pb+;while (pa<=pa_last) /* 表 La 非空且表 Lb 空 */*pc+=*pa+;while (pb<=pb_last) /* 表 Lb 非空且表 La 空 */*pc+=*pb+;(*Lc). length =pc-( *Lc). elem; /* 加此句 */void pr int (ElemType *c) pr int f("%d ",*c);void mai n()SqList La,Lb,Lc;int j;InitList(&La); /* 創(chuàng)建空表 La */for (j=1;j<=5;j+)/* 在表La中插入5個元素*/ListI nsert (&La,j,j);pr int f("La= ");/* 輸出表 La 的內(nèi)容 */ListTraverse(La,print );InitList(&Lb); /* 創(chuàng)建空表 Lb */for (j=1;j<=5;j+)/* 在表Lb中插入5個元素*/ListI nsert(&Lb,j,2*j);pr int f("Lb= ");/* 輸出表 Lb 的內(nèi)容 */ListTraverse(Lb,pr int );MergeList(La,Lb,&Lc);pr int f("Lc= ");/* 輸出表 Lc 的內(nèi)容 */ListTraverse(Lc,pr int );/* algo2-5.c實現(xiàn)算法 2.11、2.12 的程序 */#include "cl.h"typedef intElemType;#include "c2-2.h"/* c2-2.h線性表的單鏈表存儲結(jié)構(gòu)*/struct LNodeElemType data;struct LNode *n ext;;typedef struct LNode *L inkList;/* 另一種定義 LinkList的方法 */ #include "bo2-2.c"/* bo2-2.c單鏈表線性表(存儲結(jié)構(gòu)由c2-2.h定義)的基本操作(12個)*/Status In itList(Lin kList*L) /*操作結(jié)果:構(gòu)造一個空的線性表 L */*L=(LinkList) malloc ( sizeof ( struct LNode); /* 產(chǎn)生頭結(jié)點,并使 L 指向此頭結(jié)點 */if (! *L) /*存儲分配失敗*/exit (OVERFLOW);(*L)->next=NULL;/* 指針域為空 */return OK;Status DestroyList (Li nkList *L) /*初始條件:線性表L已存在。操作結(jié)果:銷毀線性表L */Lin kList q;while (*L)q=(*L)-> next;free( *L);*L=q;return OK;Status ClearList (LinkList L) /* 不改變 L */ /*初始條件:線性表L已存在。操作結(jié)果:將L重置為空表*/Lin kList p,q;p=L-> next; /* p指向第一個結(jié)點*/while (p) /* 沒到表尾*/q=p->n ext;free(p);p=q;L-> next=NULL;/*頭結(jié)點指針域為空*/return OK;Status ListEmpty (LinkList L) /*初始條件:線性表 L已存在。操作結(jié)果:若 L為空表,則返回TRUE否則返回FALSE*/if (L->next) /* 非空 */return FALSE;elsereturn TRUE;int List Length (LinkList L) /*初始條件:線性表L已存在。操作結(jié)果:返回L中數(shù)據(jù)元素個數(shù)*/int i=0;Lin kList p=L-> next;/* p 指向第一個結(jié)點 */while (p) /* 沒到表尾*/i+;p=p->n ext;return i;Status Get Elem(LinkList L, int i, ElemType *e)/* 算法 2.8 */ /* L為帶頭結(jié)點的單鏈表的頭指針。當(dāng)?shù)趇個元素存在時,其值賦給e并返回OK,否則返回 ERROR */int j=1;/* j 為計數(shù)器*/Lin kList p=L-> next;/* p 指向第一個結(jié)點 */while (p&&j<i)/*順指針向后查找,直到p指向第i個元素或p為空*/p=p->n ext;j+;if (!p|j>i)/*第i個元素不存在*/return ERROR;*e=p->data; /* 取第 i 個元素 */return OK;int Locate Elem(LinkList L, ElemType e, Status (*compare)( ElemType, ElemType) /*初始條件:線性表L已存在,compare()是數(shù)據(jù)元素判定函數(shù)(滿足為1,否則為0) */ /*操作結(jié)果:返回L中第1個與e滿足關(guān)系compare。的數(shù)據(jù)元素的位序。*/*若這樣的數(shù)據(jù)元素不存在,則返回值為0 */int i=0;Lin kList p=L->n ext;while (p)i+;if (compare(p->data,e) /*找到這樣的數(shù)據(jù)元素*/return i;p=p->n ext;return 0;Status Prior Elem(LinkList L, ElemType cur_e, ElemType *pre_e) /*初始條件:線性表L已存在*/*操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是第一個,則用pre_e返回它的前驅(qū),*/*返回OK;否則操作失敗,pre_e無定義,返回INFEASIBLE */Lin kList q,p=L-> next;/* p 指向第一個結(jié)點 */while (p->next)/* p所指結(jié)點有后繼 */q=p->next;/* q 為 p 的后繼 */if (q->data=cur_e)*pre_e=p->data;return OK;p=q; /* p 向后移*/return INFEASIBLE;Status Next Elem(LinkList L,ElemType cur_e, ElemType *next_e) /*初始條件:線性表 L已存在*/*操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是最后一個,則用next_e返回它的后繼,*/*返回OK;否則操作失敗,next_e無定義,返回INFEASIBLE */Lin kList p=L-> next;/* p 指向第一個結(jié)點 */while (p->next)/* p所指結(jié)點有后繼 */if (p->data=cur_e)*n ext_e=p->n ext->data;return OK;p=p->n ext;return INFEASIBLE;Status List In sert(Li nkList L,int i, ElemType e) /* 算法 2.9。不改變 L */ /*在帶頭結(jié)點的單鏈線性表L中第i個位置之前插入元素e */int j=0;Lin kList p=L,s;while (p&&j<i-1)/* 尋找第 i-1 個結(jié)點 */p=p->n ext;j+;if (!p|j>i-1)/* i 小于1或者大于表長*/return ERROR;s=(LinkList) malloc (sizeof (struct LNode); /* 生成新結(jié)點 */s->data=e; /* 插入 L 中 */s->n ext=p->n ext;p_>n ext=s;return OK;Status ListDelete(LinkList L,int i, ElemType *e) /* 算法 2.10。不改變 L */ /*在帶頭結(jié)點的單鏈線性表L中,刪除第i個元素,并由e返回其值*/int j=0;Lin kList p=L,q;while (p->next&&j<i-1)/*尋找第i個結(jié)點,并令p指向其前趨*/p=p->n ext;j+;if (!p->next|j>i-1)/* 刪除位置不合理 */return ERROR;q=p->next;/*刪除并釋放結(jié)點*/p_>n ext=q _>n ext;*e=q_>data;free(q);return OK;Status ListTraverse(LinkList L,void(*vi)(ElemType)/* vi的形參類型為 ElemType,與bo2-1.c中相應(yīng)函數(shù)的形參類型ElemType&不同*/ /*初始條件:線性表 L已存在*/*操作結(jié)果:依次對L的每個數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,則操作失敗*/Lin kList p=L->n ext;while (p)vi(p->data);p=p->n ext;pr int f("n");return OK;void CreateList(LinkList*L, int n) /* 算法 2.11 */ /*逆位序(插在表頭)輸入n個元素的值,建立帶表頭結(jié)構(gòu)的單鏈線性表L */int i;Lin kList p;*L=(LinkList)malloc (sizeof (struct LNode);(*L)-> next=NULL; /* 先建立一個帶頭結(jié)點的單鏈表*/pr int f("請輸入d個數(shù)據(jù)n",n);for (i=n;i>0;_i)p=(LinkList) malloc (sizeof (struct LNode); /* 生成新結(jié)點 */scanf("%d",&p->data);/* 輸入元素值 */p->next=(*L )->next; /* 插入到表頭 */(*L)->n ext=p;void CreateList2(LinkList *L, int n) /*正位序(插在表尾)輸入n個元素的值,建立帶表頭結(jié)構(gòu)的單鏈線性表*/int i;Lin kList p,q;*L=(LinkList)malloc (sizeof (struct LNode); /* 生成頭結(jié)點 */(*L)-> next=NULL;q= *L;pr int f("請輸入d個數(shù)據(jù)n",n);for (i=1;i<=n;i+)p=(LinkList) malloc (sizeof (struct LNode);scan f("%d",&p->data);q_>n ext=p;q=q_>n ext;p-> next=NULL;void MergeList(LinkList La,LinkList*Lb,LinkList *Lc)/* 算法 2.12 */ /*已知單鏈線性表 La和Lb的元素按值非遞減排列。*/*歸并La和Lb得到新的單鏈線性表Lc,Lc的元素也按值非遞減排列*/LinkList pa=La->next,pb=(*L b)->next,pc;*Lc=pc=La; /*用La的頭結(jié)點作為 Lc的頭結(jié)點*/while (pa&&pb)if (pa->data<=pb->data)pc- >n ext=pa;pc=pa;pa=pa->n ext;elsepc- >n ext=pb;pc=pb;pb=pb->n ext;pc->next=pa?pa:pb; /* 插入剩余段 */free( *Lb); /*釋放Lb的頭結(jié)點*/Lb=NULL;void visit( ElemType c) /* ListTraverse() 調(diào)用的函數(shù)(類型要一致)*/pr int f("%d ”,c);void mai n()int n=5;Lin kList La,Lb,Lc;pr int f("按非遞減順序,");CreateList2(&La,n);/*正位序輸入 n個元素的值*/pr int f("La=");/*輸出鏈表La的內(nèi)容*/ListTraverse(La,visit);pr int f("按非遞增順序,");CreateList(&Lb,n);/* 逆位序輸入 n個元素的值*/pr int f("Lb=");/*輸出鏈表Lb的內(nèi)容*/ListTraverse(Lb,visit);MergeList(La,&Lb,&Lc);/* 按非遞減順序歸并 La和Lb,得到新表Lc */pr int f("Lc=");/*輸出鏈表Lc的內(nèi)容*/ListTraverse(Lc,visit);/* algo2-6.c利用單鏈表結(jié)構(gòu)處理教科書圖2.1(學(xué)生健康登記表)*/#include "c1.h"#defi ne NAMELEN 8 /* 姓名最大長度 */#defi ne CLASSLEN 4 /* 班級名最大長度 */struct stud /* 記錄的結(jié)構(gòu)*/char nameNAMELEN+1;long num;char sex;int age;char ClassCLASSLEN+1;int health;typedef struct stud ElemType; /*鏈表結(jié)點元素類型為結(jié)構(gòu)體*/#include "c2-2.h"char sta39=" 健康",” 一般",”神經(jīng)衰弱"/*健康狀況(3類)*/FILE *fp;Status InitList(LinkList*L) /* 拷自 bo2-2.c */ /*操作結(jié)果:構(gòu)造一個空的線性表L */*L=(LinkList)malloc (sizeof (struct LNode); /* 產(chǎn)生頭結(jié)點,并使 L 指向此頭結(jié)點*/if (! *L) /*存儲分配失敗*/exit (OVERFLOW);(*L)->next=NULL; /* 指針域為空 */return OK;Status ListTraverse(LinkList L,void(*vi)(ElemType) /* 拷自 bo2-2.c */ /*初始條件:線性表 L已存在*/*操作結(jié)果:依次對L的每個數(shù)據(jù)元素調(diào)用函數(shù)vi()。一旦vi()失敗,則操作失敗*/Lin kList p=L->n ext;while (p)vi(p->data);p=p->n ext;pr int f("n");return OK;void In sertAsce nd(Li nkList L,ElemType e) /* 此函數(shù)是由 bo2-9.c 中的同名函數(shù)改寫*/ /*按學(xué)號非降序插入*/Lin kList q=L,p=L->n ext;while (p&&e.num>p->data.num)q=p;p=p->n ext;q->next=(LinkList)malloc (sizeof (struct LNode); /* 插在 q 后 */q->n ext->data=e;q_>n ext- >n ext=p; void Print (struct stud e) /*顯示記錄e的內(nèi)容*/pr int f("%-8s %6ld",e.name,e.num);if (e.sex='m')pr int f("男");elsepr int f("女");pr int f("%5d %-4s",e.age,e.Class);pr int f("%9sn",stae.health);void Readln( struct stud *e) /*由鍵盤輸入結(jié)點信息*/pr int f("請輸入姓名(<=%d個字符):",NAMELEN);sca nf("%s",e->n ame);pr int f("請輸入學(xué)號:");sca nf("%ld", &e-> nu m);pr int f("請輸入性別(m:男f:女):");sca nf("%*c%c", &e->sex);pr int f("請輸入年齡:");sca nf("%d", &e->age);pr int f("請輸入班級(<=%d個字符):",CLASSLEN);sca nf("%s",e->Class);pr int f("請輸入健康狀況(0:%s 1:%s 2:%s):",sta0,sta1,sta2); sca nf("%d", &e->health);void WriteToFile( struct stud e) /*將結(jié)點信息寫入fp指定的文件*/fwrite(&e,sizeof (struct stud),1,fp);Status ReadFromFile( struct stud *e) /*由fp指定的文件讀取結(jié)點信息到e */int i;i=fread(e, sizeof (struct stud),1,fp);if (i=1)/* 讀取文件成功*/return OK;elsereturn ERROR;Status FindFromNum(LinkList L,long num,LinkList *p,LinkList *q) /*查找表中學(xué)號為num的結(jié)點,如找到,q指向此結(jié)點,p指向q的前驅(qū),*/*并返回TRUE如無此元素,則返回FALSE */*p=L;while (*p)*q=(*p)-> next;if (*q&&(*q)->data.num>num)/*因為是按學(xué)號非降序排列*/break;if (*q&&(*q)->data.num=num)/* 找到該學(xué)號 */return TRUE;*p=*q;return FALSE;Status FindFromName(LinkList L,char name,LinkList *p,LinkList *q) /*查找表中姓名為name的結(jié)點,如找到,q指向此結(jié)點,p指向q的前驅(qū),*/*并返回TRUE如無此元素,則返回FALSE */*p=L;while (*p)*q=(*p)-> next;if (*q&&!strcmp(*q)->data.name,name)/* 找到該姓名 */return TRUE;*p=*q;FALSE; returnStatus Delete ElemNum(LinkList L,long num) /*刪除表中學(xué)號為num的元素,并返回TRUE如無此元素,則返回 FALSE */Lin kList p,q;if (FindFromNum(L,num,&p,&q)/*找到此結(jié)點,且q指向其,p指向其前驅(qū)*/p_>n ext=q _>n ext;free(q);return TRUE;return FALSE;Status Delete ElemName(LinkList L,char name) /*刪除表中姓名為name的元素,并返回 TRUE如無此元素,則返回 FALSE */Lin kList p,q;if (FindFromName(L,name,&p,&q)/* 找到此結(jié)點,且q指向其,p指向其前驅(qū)*/p_>n ext=q _>n ext;free(q);return TRUE;return FALSE;void Modf y( ElemType *e) /*修改結(jié)點內(nèi)容*/char s80;Pr int (*e);/* 顯示原內(nèi)容 */pr int f("請輸入待修改項的內(nèi)容,不修改的項按回車鍵保持原值:n");pr int f("請輸入姓名(<=%d個字符):",NAMELEN);gets(s);if (strlen(s)strcpy(e->n ame,s);pr int f("請輸入學(xué)號:");gets(s);if (strlen(s)e->num=atol(s);pr int f("請輸入性別(m:男f:女):");gets(s);if (strlen(s)e_>sex=s0;pr int f("請輸入年齡:");gets(s);if (strlen(s)e_>age=atoi(s);pr int f("請輸入班級(<=%d個字符):",CLASSLEN); gets(s);if (strlen(s)strcpy(e->Class,s);pr int f("請輸入健康狀況(0:%s 1:%s 2:%s):",sta0,sta1,sta2); gets(s);if (strlen(s)e->health=atoi(s);/* 修改完畢 */#define N 4 /* student記錄的個數(shù) */void mai n()struct stud stude ntN="王小林",790631,'m',18,"計 91",0,"陳紅",790632,'f,20,"計 91",1,"劉建平",790633,'m',21,"計 91",0,"*/張立立",790634,'m',17,"計91",2;/*表的初始記錄int i,j,flag=1;long num;char file name13, nameNAMELEN+1;ElemType e;Lin kList T,p,q;InitList(&T); /* 初始化鏈表 */while (flag)pr int f("1:將結(jié)構(gòu)體數(shù)組student中的記錄按學(xué)號非降序插入鏈表n");pr int f("2:將文件中的記錄按學(xué)號非降序插入鏈表n");pr int f("3:鍵盤輸入新記錄,并將其按學(xué)號非降序插入鏈表n");printf("4:刪除鏈表中第一個有給定學(xué)號的記錄n");printf("5:刪除鏈表中第一個有給定姓名的記錄n”);printf("6:修改鏈表中第一個有給定學(xué)號的記錄n”);printf("7:修改鏈表中第一個有給定姓名的記錄n");printf("8:查找鏈表中第一個有給定學(xué)號的記錄n");printf("9:查找鏈表中第一個有給定姓名的記錄n”);pr int f("10:顯示所有記錄11:將鏈表中的所有記錄存入文件12:結(jié)束n");pr int f("請選擇操作命令:");scan f("%d",&i);switch(i)case 1:for (j=0;j<N;j+)In sertAsce nd(T,stude ntj);break;case 2: pr int f("請輸入文件名:”);sea nf("%s",file name);if (fp=fopen(filename,"rb")=NULL)print f("打開文件失敗!n");elsewhile (ReadFromFile(&e)In sertAsce nd(T,e);fclose(fp);break;case 3: ReadI n(& e);In sertAsce nd(T,e);break;case 4: print f("請輸入待刪除記錄的學(xué)號:");scan f("%ld", &nu m);if (!Delete ElemNum(T,num)print f("沒有學(xué)號為 %ld的記錄n",num);break;case 5: pr int f("請輸入待刪除記錄的姓名:");sca nf("%s", name);if (!Delete ElemName(T,name)print f("沒有姓名為 %s的記錄n”,name);break;ca

注意事項

本文(清華嚴(yán)蔚敏《大數(shù)據(jù)結(jié)構(gòu)》地全部代碼實現(xiàn)C語言)為本站會員(m****)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!