数据结构源代码C语言描述Word文档下载推荐.docx
- 文档编号:22057421
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:41
- 大小:36.05KB
数据结构源代码C语言描述Word文档下载推荐.docx
《数据结构源代码C语言描述Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构源代码C语言描述Word文档下载推荐.docx(41页珍藏版)》请在冰豆网上搜索。
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==
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 源代码 语言 描述