数据结构源代码C语言描述Word文档下载推荐.docx

上传人:b****6 文档编号:22057421 上传时间:2023-02-02 格式:DOCX 页数:41 大小:36.05KB
下载 相关 举报
数据结构源代码C语言描述Word文档下载推荐.docx_第1页
第1页 / 共41页
数据结构源代码C语言描述Word文档下载推荐.docx_第2页
第2页 / 共41页
数据结构源代码C语言描述Word文档下载推荐.docx_第3页
第3页 / 共41页
数据结构源代码C语言描述Word文档下载推荐.docx_第4页
第4页 / 共41页
数据结构源代码C语言描述Word文档下载推荐.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

数据结构源代码C语言描述Word文档下载推荐.docx

《数据结构源代码C语言描述Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构源代码C语言描述Word文档下载推荐.docx(41页珍藏版)》请在冰豆网上搜索。

数据结构源代码C语言描述Word文档下载推荐.docx

for(j=*num;

j>

=i;

j--)

List[j+1]=List[j];

/*数据元素后移*/

List[i]=x;

/*插入x*/

(*num)++;

/*长度加1*/

returnTRUE;

P18【算法2.2顺序表的删除】

intDelete(ElemtypeList[],int*num,inti)

{/*在线性表List[]中,*num为表尾元素下标位置,删除第i个长度,线性表的长度减1,若成功,则返回TRUE;

否则返回FALSE。

if(i<

*num)

{printf("

}/*删除位置出错!

*/

for(j=i+1;

j<

=*num;

j++)

List[j-1]=List[j];

/*数据元素前移*/

(*num)--;

/*长度减1*/

}

P19例:

将有序线性表La={2,4,6,7,9},Lb={1,5,7,8},合并为Lc={1,2,4,5,6,7,7,8,9}。

voidmerge(ElemtypeLa[],ElemtypeLb[],Elemtype**Lc)

{inti,j,k;

intLa_length,Lb_length;

i=j=0;

k=0;

La_length=Length(La);

Lb_length=Length(Lb);

/*取表La,Lb的长度*/

Initiate(Lc);

/*初始化表Lc*/

While(i<

=La_length&

&

=Lb_length)

{a=get(La,i);

b=get(Lb,j);

if(a<

b){insert(Lc,++k,a);

++i;

else{insert(Lc,++k,b);

++j;

/*将La和Lb的元素插入到Lc中*/

while(i<

=La_length){a=get(La,i);

insert(Lc,++k,a);

while(j<

=lb_length){b=get(La,j);

insert(Lc,++k,b);

P21例如:

下面定义的结点类型中,数据域包含三个数据项:

学号、姓名、成绩。

Structstudent

{charnum[8];

/*数据域*/

harname[8];

intscore;

structstudent*next;

/*指针域*/

P21单链表结点结构定义为:

Typedefstructslnode

{Elemtypedata;

structslnode*next;

}slnodetype;

slnodetype*p,*q,*s;

P21【算法2.3单链表的初始化】

intInitiate(slnodetype**h)

{if((*h=(slnodetype*)malloc(sizeof(slnodetype)))==NULL)returnFALSE;

(*h)->

next=NULL;

returnTRUE;

P22【算法2.4单链表的后插入】

{s=(slnodetype*)malloc(sizeof(slnodetype));

s->

data=x;

next=p->

next;

p->

next=s;

P22【算法2.5单链表的结点插入】

{q=head;

while(q->

next!

=p)q=q->

s=(slnodetype*)malloc(sizeof(slnodetype));

s->

next=p;

q->

P23【算法2.6单链表的前插入】

intinsert(slnodetype*h,inti,Elemtypex)

{/*在链表h中,在第i个数据元素前插入一个数据元素x*/

intj=0;

p=h;

while(p!

=NULL&

i-1){p=q->

j++;

/*寻找第i-1个结点*/}

if(j!

=i-1){printf("

returnFALSE;

/*插入位置错误*/}

if((s=(slnodetype*)malloc(sizeof(slnodetype)))==NULL)returnFALSE;

P23例:

下面C程序中的功能是,首先建立一个线性链表head={3,5,7,9},其元素值依次为从键盘输入正整数(以输入一个非正整数为结束);

在线性表中值为x的元素前插入一个值为y的数据元素。

若值为x的结点不存在,则将y插在表尾。

#include"

stdlib.h"

stdio.h"

structslnode

{intdata;

structslnode*next;

/*定义结点类型*/

main()

{intx,y,d;

structslnode*head,*p,*q,*s;

head=NULL;

/*置链表空*/

q=NULL;

scanf("

%d"

&

d);

/*输入链表数据元素*/

while(d>

0)

{p=(structslnode*)malloc(sizeof(structslnode));

/*申请一个新结点*/

p->

data=d;

if(head==NULL)head=p;

/*若链表为空,则将头指针指向当前结点p*/

elseq->

/*链表不为空时,则将新结点链接在最后*/

q=p;

/*将指针q指向链表的最后一个结点*/

%d,%d"

x,&

y);

s=(structslnode*)malloc(sizeof(structslnode));

data=y;

q=head;

p=q->

while((p!

=NULL)&

(p->

data!

=x)){q=p;

p=p->

}/*查找元素为x的指针*/

/*插入元素y*/

P24【算法2.7单链表的删除】

intDelet(slnodetype*h,inti)

{/*在链表h中删除第i个结点*/

slnodetype*p,*s;

intj;

p=h;

j=0;

while(p->

i-1)

{p=p->

j=j+1;

/*寻找第i-1个结点,p指向其前驱*/}

if(j!

=i-1)

/*删除位置错误!

s=p->

next->

/*删除第i个结点*/

free(s);

/*释放被删除结点空间*/

P25例:

假设已有线性链表La,编制算法将该链表逆置。

voidconverse(slnodetype*head)

{slnodetype*p,*q;

p=head->

head->

=NULL)

{q=p->

next=head->

head->

p=q;

P27例:

将两个循环链表首尾相接。

La为第一个循环链表表尾指针,Lb为第二个循环链表表尾指针。

合并后Lb为新链表的尾指针。

Voidmerge(slnodetype*La,slnodetype*Lb)

{slnodetype*p;

p=La->

Lb->

next=La->

La->

free(p);

P29【算法2.8双向链表的插入】

intinsert_dul(dlnodetype*head,inti,Elemtypex)

{/*在带头结点的双向链表中第i个位置之前插入元素x*/

dlnodetype*p,*s;

p=head;

while(p!

i)

j++;

=i||i<

1)

{printf("

if((s=(dlnodetype*)malloc(sizeof(dlnodetype)))==NULL)returnFALSE;

prior=p->

prior;

/*图中步骤①*/

prior->

/*图中步骤②*/

/*图中步骤③*/

prior=s;

/*图中步骤④*/

P30【算法2.9双向链表的删除】

intDelete_dl(dlnodetype*head,inti)

{dlnodetype*p,*s;

s=p;

P32【算法2.10多项式相加】

structpoly*add_poly(structpoly*Ah,structpoly*Bh)

{structpoly*qa,*qb,*s,*r,*Ch;

qa=Ah->

qb=Bh->

/*qa和qb分别指向两个链表的第一结点*/

r=qa;

Ch=Ah;

/*将链表Ah作为相加后的和链表*/

while(qa!

qb!

=NULL) 

/*两链表均非空*/

{if(qa->

exp==qb->

exp) 

/*两者指数值相等*/

{x=qa->

coef+qb->

coef;

if(x!

=0)

{qa->

coef=x;

r->

next=qa;

s=qb++;

qa++;

/*相加后系数不为零时*/

else{s=qa++;

s=qb++;

}/*相加后系数为零时*/

elseif(qa->

exp<

qb->

exp){r->

}/*多项式Ah的指数值小*/

else{r->

next=qb;

r=qb;

qb++;

/*多项式Bh的指数值小*/

if(qa==NULL)r->

elser->

/*链接多项式Ah或Bh中的剩余结点*/

return(Ch);

第三章栈和队列

P35相应的C语言函数是:

floatfact(intn)

{floats;

if(n==0||n==1)s=1;

elses=n*fact(n-1);

return(s);

P38用C语言定义的顺序存储结构的栈如下:

#defineMAXNUM<

最大元素数>

typedefstruct{

Elemtypestack[MAXNUM];

inttop;

}sqstack;

P39【算法3.1栈的初始化】

intinitStack(sqstack*s)

{/*创建一个空栈由指针S指出*/

if((s=(sqstack*)malloc(sizeof(sqstack)))==NULL)returnFALSE;

top=-1;

P39【算法3.2入栈操作】

intpush(sqstack*s,Elemtypex)

{/*将元素x插入到栈s中,作为s的新栈顶*/

if(s->

top>

=MAXNUM-1)returnFALSE;

/*栈满*/

top++;

stack[s->

top]=x;

P39【算法3.3出栈操作】

Elemtypepop(sqstack*s)

{/*若栈s不为空,则删除栈顶元素*/

Elemtypex;

top<

0)returnNULL;

/*栈空*/

x=s->

top];

top--;

returnx;

P39【算法3.4取栈顶元素】

ElemtypegetTop(sqstack*s)

{/*若栈s不为空,则返回栈顶元素*/

return(s->

top]);

P40【算法3.5判栈空操作】

intEmpty(sqstack*s)

{/*栈s为空时,返回为TRUE;

非空时,返回为FALSE*/

0)returnTRUE;

P40【算法3.6栈置空操作】

voidsetEmpty(sqstack*s)

{/*将栈s的栈顶指针top,置为-1*/

P40C语言定义的这种两栈共享邻接空间的结构如下:

Typedefstruct{

intlefttop;

/*左栈栈顶位置指示器*/

intrighttop;

/*右栈栈顶位置指示器*/

}dupsqstack;

P41【算法3.7共享栈的初始化】

intinitDupStack(dupsqstack*s)

{/*创建两个共享邻接空间的空栈由指针S指出*/

if(s=(dupsqstack*)malloc(sizeof(dupsqstack)))==NULL)returnFALSE;

lefttop=-1;

righttop=MAXNUM;

P41【算法3.8共享栈的入栈操作】

intpushDupStack(dupsqstack*s,charstatus,Elemtypex)

{*把数据元素x压入左栈(status='

L'

)或右栈(status='

R'

)*/

lefttop+1==s->

righttop)returnFALSE;

if(status='

)s->

stack[++s->

lefttop]=x;

/*左栈进栈*/

elseif(status='

stack[--s->

righttop]=x;

/*右栈进栈*/

elsereturnFALSE;

/*参数错误*/

P42【算法3.9共享栈的出栈操作】

ElemtypepopDupStack(dupsqstack*s,charstatus)

{/*从左栈(status='

)退出栈顶元素*/

if(status=='

{if(s->

lefttop<

returnNULL;

/*左栈为空*/

elsereturn(s->

lefttop--]);

/*左栈出栈*/

elseif(status=='

righttop>

MAXNUM-1)

/*右栈为空*/

righttop++]);

/*右栈出栈*/

elsereturnNULL;

P42链栈的C语言定义为:

typedefstructStacknode

Elemtypedata;

StructStacknode*next;

}slStacktype;

P43【算法3.10单个链栈的入栈操作】

intpushLstack(slStacktype*top,Elemtypex)

{/*将元素x压入链栈top中*/

slStacktype*p;

if((p=(slStacktype*)malloc(sizeof(slStacktype)))==NULL)returnFALSE;

/*申请一个结点*/

next=top;

top=p;

P43【算法3.11单个链栈的出栈操作】

ElemtypepopLstack(slStacktype*top)

{/*从链栈top中删除栈顶元素*/

if(top==NULL)returnNULL;

/*空栈*/

p=top;

top=top->

x=p->

data;

free(p);

P44【算法3.12多个链栈的入栈操作】

intpushDupLs(slStacktype*top[M],inti,Elemtypex)

{/*将元素x压入链栈top[i]中*/

next=top[i];

top[i]=p;

P44【算法3.13多个链栈的出栈操作】

ElemtypepopDupLs(slStacktype*top[M],inti)

{/*从链栈top[i]中删除栈顶元素*/

if(top[i]==NULL)returnNULL;

p=top[i];

top[i]=top[i]->

P47【算法3.14中缀表达式变为后缀表达式】

#defineMAXNUM40

#defineFALSE0

#defineTRUE1

string.h"

charstack[MAXNUM];

{/*初始化栈*/

top=-1;

intpush(sqstack*s,charx)

charpop(sqstack*s)

charx;

x=s->

chargettop(sqstack*s)

if(s->

charprecede(charx1,charx2)

{/*比较运算符x1与x2的优先*/

charresult='

<

'

;

charsting[2];

sting[0]=x2;

sting[1]='

\0'

if(((x1=='

+'

||x1=='

-'

)&

(strstr("

+-)#"

sting)!

=NULL))||

((x1=='

*'

/'

strstr("

+-*/)#"

=NULL)||

(x1=='

)'

=NULL))

{result='

>

elseif(x1=='

('

x2=='

#'

='

elseif(x1=='

||x1==

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

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1