清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx

上传人:b****5 文档编号:8557987 上传时间:2023-05-11 格式:DOCX 页数:89 大小:43.14KB
下载 相关 举报
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第1页
第1页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第2页
第2页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第3页
第3页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第4页
第4页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第5页
第5页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第6页
第6页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第7页
第7页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第8页
第8页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第9页
第9页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第10页
第10页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第11页
第11页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第12页
第12页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第13页
第13页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第14页
第14页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第15页
第15页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第16页
第16页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第17页
第17页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第18页
第18页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第19页
第19页 / 共89页
清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx_第20页
第20页 / 共89页
亲,该文档总共89页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx

《清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx(89页珍藏版)》请在冰点文库上搜索。

清华严蔚敏《数据结构》的全部代码实现C语言Word格式文档下载.docx

#include"

c2-1.h"

/*c2-1.h线性表的动态分配顺序存储结构*/

#defineLIST_INIT_SIZE10/*线性表存储空间的初始分配量*/

#defineLISTINCREMENT2/*线性表存储空间的分配增量*/

typedefstruct

{

ElemType*elem;

/*存储空间基址*/

intlength;

/*当前长度*/

intlistsize;

/*当前分配的存储容量(以sizeof(ElemType)为单位)*/

}SqList;

bo2-1.c"

/*bo2-1.c顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个)*/

StatusInitList(SqList*L)/*算法2.3*/

{/*操作结果:

构造一个空的顺序线性表*/

(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!

(*L).elem)

exit(OVERFLOW);

/*存储分配失败*/

(*L).length=0;

/*空表长度为0*/

(*L).listsize=LIST_INIT_SIZE;

/*初始存储容量*/

returnOK;

}

StatusDestroyList(SqList*L)

{/*初始条件:

顺序线性表L已存在。

操作结果:

销毁顺序线性表L*/

free((*L).elem);

(*L).elem=NULL;

(*L).listsize=0;

StatusClearList(SqList*L)

将L重置为空表*/

StatusListEmpty(SqListL)

若L为空表,则返回TRUE,否则返回FALSE*/

if(L.length==0)

returnTRUE;

else

returnFALSE;

intListLength(SqListL)

返回L中数据元素个数*/

returnL.length;

StatusGetElem(SqListL,inti,ElemType*e)

顺序线性表L已存在,1≤i≤ListLength(L)*/

/*操作结果:

用e返回L中第i个数据元素的值*/

if(i<

1||i>

L.length)

exit(ERROR);

*e=*(L.elem+i-1);

intLocateElem(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType))

顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)*/

返回L中第1个与e满足关系compare()的数据元素的位序。

*/

/*若这样的数据元素不存在,则返回值为0。

算法2.6*/

ElemType*p;

inti=1;

/*i的初值为第1个元素的位序*/

p=L.elem;

/*p的初值为第1个元素的存储位置*/

while(i<

=L.length&

&

!

compare(*p++,e))

++i;

=L.length)

returni;

return0;

StatusPriorElem(SqListL,ElemTypecur_e,ElemType*pre_e)

顺序线性表L已存在*/

若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,*/

/*否则操作失败,pre_e无定义*/

inti=2;

ElemType*p=L.elem+1;

*p!

=cur_e)

p++;

i++;

if(i>

returnINFEASIBLE;

*pre_e=*--p;

StatusNextElem(SqListL,ElemTypecur_e,ElemType*next_e)

若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,*/

/*否则操作失败,next_e无定义*/

ElemType*p=L.elem;

L.length&

if(i==L.length)

*next_e=*++p;

StatusListInsert(SqList*L,inti,ElemTypee)/*算法2.4*/

顺序线性表L已存在,1≤i≤ListLength(L)+1*/

在L中第i个位置之前插入新的数据元素e,L的长度加1*/

ElemType*newbase,*q,*p;

(*L).length+1)/*i值不合法*/

returnERROR;

if((*L).length>

=(*L).listsize)/*当前存储空间已满,增加分配*/

newbase=(ElemType*)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));

newbase)

(*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*/

StatusListDelete(SqList*L,inti,ElemType*e)/*算法2.5*/

删除L的第i个数据元素,并用e返回其值,L的长度减1*/

ElemType*p,*q;

(*L).length)/*i值不合法*/

p=(*L).elem+i-1;

/*p为被删除元素的位置*/

*e=*p;

/*被删除元素的值赋给e*/

q=(*L).elem+(*L).length-1;

/*表尾元素的位置*/

for(++p;

p<

++p)/*被删除元素之后的元素左移*/

*(p-1)=*p;

(*L).length--;

/*表长减1*/

StatusListTraverse(SqListL,void(*vi)(ElemType*))

依次对L的每个数据元素调用函数vi()。

一旦vi()失败,则操作失败*/

/*vi()的形参加'

'

,表明可通过调用vi()改变元素的值*/

inti;

for(i=1;

i<

=L.length;

i++)

vi(p++);

printf("

\n"

);

Statusequal(ElemTypec1,ElemTypec2)

{/*判断是否相等的函数,Union()用到*/

if(c1==c2)

voidUnion(SqList*La,SqListLb)/*算法2.1*/

{/*将所有在线性表Lb中但不在La中的数据元素插入到La中*/

ElemTypee;

intLa_len,Lb_len;

La_len=ListLength(*La);

/*求线性表的长度*/

Lb_len=ListLength(Lb);

=Lb_len;

GetElem(Lb,i,&

e);

/*取Lb中第i个数据元素赋给e*/

LocateElem(*La,e,equal))/*La中不存在和e相同的元素,则插入之*/

ListInsert(La,++La_len,e);

voidprint(ElemType*c)

%d"

*c);

voidmain()

SqListLa,Lb;

Statusi;

intj;

i=InitList(&

La);

if(i==1)/*创建空表La成功*/

for(j=1;

j<

=5;

j++)/*在表La中插入5个元素*/

i=ListInsert(&

La,j,j);

La="

/*输出表La的内容*/

ListTraverse(La,print);

InitList(&

Lb);

/*也可不判断是否创建成功*/

j++)/*在表Lb中插入5个元素*/

Lb,j,2*j);

Lb="

/*输出表Lb的内容*/

ListTraverse(Lb,print);

Union(&

La,Lb);

newLa="

/*输出新表La的内容*/

}

/*algo2-2.c实现算法2.2的程序*/

voidMergeList(SqListLa,SqListLb,SqList*Lc)/*算法2.2*/

{/*已知线性表La和Lb中的数据元素按值非递减排列。

/*归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列*/

inti=1,j=1,k=0;

ElemTypeai,bj;

InitList(Lc);

/*创建空表Lc*/

La_len=ListLength(La);

=La_len&

=Lb_len)/*表La和表Lb均非空*/

GetElem(La,i,&

ai);

GetElem(Lb,j,&

bj);

if(ai<

=bj)

ListInsert(Lc,++k,ai);

ListInsert(Lc,++k,bj);

++j;

=La_len)/*表La非空且表Lb空*/

GetElem(La,i++,&

while(j<

=Lb_len)/*表Lb非空且表La空*/

GetElem(Lb,j++,&

SqListLa,Lb,Lc;

intj,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};

/*创建空表La*/

=4;

j++)/*在表La中插入4个元素*/

ListInsert(&

La,j,a[j-1]);

/*创建空表Lb*/

=7;

j++)/*在表Lb中插入7个元素*/

Lb,j,b[j-1]);

MergeList(La,Lb,&

Lc);

Lc="

/*输出表Lc的内容*/

ListTraverse(Lc,print);

/*algo2-3.c实现算法2.7的程序*/

voidMergeList(SqListLa,SqListLb,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).listsize=(*Lc).length=La.length+Lb.length;

/*不用InitList()创建空表Lc*/

pc=(*Lc).elem=(ElemType*)malloc((*Lc).listsize*sizeof(ElemType));

(*Lc).elem)/*存储分配失败*/

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++;

*pc++=*pb++;

=pa_last)/*表La非空且表Lb空*/

/*插入La的剩余元素*/

while(pb<

=pb_last)/*表Lb非空且表La空*/

/*插入Lb的剩余元素*/

/*algo2-4.c修改算法2.7的第一个循环语句中的条件语句为开关语句,且当*/

/**pa=*pb时,只将两者中之一插入Lc。

此操作的结果和算法2.1相同*/

intcomp(ElemTypec1,ElemTypec2)

if(c1<

c2)

i=1;

elseif(c1==c2)

i=0;

i=-1;

voidMergeList(SqListLa,SqListLb,SqList*Lc)

{/*另一种合并线性表的方法(根据算法2.7下的要求修改算法2.7)*/

(*Lc).listsize=La.length+Lb.length;

/*此句与算法2.7不同*/

(*Lc).elem)

switch(comp(*pa,*pb))/*此句与算法2.7不同*/

case0:

pb++;

case1:

break;

case-1:

(*Lc).length=pc-(*Lc).elem;

/*加此句*/

/*algo2-5.c实现算法2.11、2.12的程序*/

c2-2.h"

/*c2-2.h线性表的单链表存储结构*/

structLNode

ElemTypedata;

structLNode*next;

};

typedefstructLNode*LinkList;

/*另一种定义LinkList的方法*/

bo2-2.c"

/*bo2-2.c单链表线性表(存储结构由c2-2.h定义)的基本操作(12个)*/

StatusInitList(LinkList*L)

构造一个空的线性表L*/

*L=(LinkList)malloc(sizeof(structLNode));

/*产生头结点,并使L指向此头结点*/

*L)/*存储分配失败*/

exit(OVERFLOW)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2