数据结构源代码C语言描述.docx

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

数据结构源代码C语言描述.docx

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

数据结构源代码C语言描述.docx

数据结构源代码C语言描述

数据结构源代码归纳

(一)

2008年08月01日星期五23:

46

第一章  绪论

P8

例:

计算f=1!

+2!

+3!

+…+n!

,用C语言描述。

voidfactorsum(n)

intn;

{

inti,j;

intf,w;

f=0;

for(i=1;i〈=n;i++)

{

w=1;

for(j=1;j〈=i;j++)

w=w*j;

f=f+w;

}

return;

}

第二章线性表

P16【算法2.1顺序表的插入】

intInsert(ElemtypeList[],int*num,inti,Elemtypex)

{/*在顺序表List[]中,*num为表尾元素下标位置,在第i个元素前插入数据元素x,若成功,返回TRUE,否则返回FALSE。

*/

intj;

if(i<0||i>*num+1)

   {printf("Error!

");      /*插入位置出错*/

   returnFALSE;}

if(*num>=MAXNUM-1)

   {printf("overflow!

");

   returnFALSE;}    /*表已满*/

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。

*/

intj;

if(i<0||i>*num)

{printf("Error!

");returnFALSE;}/*删除位置出错!

*/

for(j=i+1;j<=*num;j++)

List[j-1]=List[j];    /*数据元素前移*/

  (*num)--;     /*长度减1*/

returnTRUE;}

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&&j<=Lb_length)

    {a=get(La,i);b=get(Lb,j);

       if(a

       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;

  s->next=p->next;p->next=s;}

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

{q=head;

while(q->next!

=p)q=q->next;

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

s->data=x;

s->next=p;

q->next=s;}

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

intinsert(slnodetype*h,inti,Elemtypex)

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

slnodetype*p,*q,*s;

intj=0;

p=h;

while(p!

=NULL&&jnext;j++;  /*寻找第i-1个结点*/}

if(j!

=i-1){printf("Error!

");returnFALSE;  /*插入位置错误*/}

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

s->data=x;

s->next=p->next;

q->next=s;

returnTRUE;}

P23例:

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

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

#include"stdlib.h"

#include"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;

  p->next=NULL;

  if(head==NULL)head=p;/*若链表为空,则将头指针指向当前结点p*/

  elseq->next=p;  /*链表不为空时,则将新结点链接在最后*/

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

scanf("%d",&d);}

scanf("%d,%d",&x,&y);

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

s->data=y;

q=head;p=q->next;

while((p!

=NULL)&&(p->data!

=x)){q=p;p=p->next;}/*查找元素为x的指针*/

s->next=p;q->next=s;/*插入元素y*/

}

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

intDelet(slnodetype*h,inti)

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

slnodetype*p,*s;

  intj;

  p=h;j=0;

while(p->next!

=NULL&&j

{p=p->next;j=j+1;/*寻找第i-1个结点,p指向其前驱*/}

if(j!

=i-1)

    {printf("Error!

");/*删除位置错误!

*/

      returnFALSE;}

s=p->next;

p->next=p->next->next;/*删除第i个结点*/

free(s);/*释放被删除结点空间*/

returnTRUE;

}

P25例:

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

voidconverse(slnodetype*head)

{slnodetype*p,*q;

p=head->next;

head->next=NULL;

while(p!

=NULL)

  {q=p->next;

    p->next=head->next;

    head->next=p;

    p=q;}

}

P27例:

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

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

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

Voidmerge(slnodetype*La,slnodetype*Lb)

{slnodetype*p;

  p=La->next;

  Lb->next=La->next;

  La->next=p->next;

  free(p);

}

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

intinsert_dul(dlnodetype*head,inti,Elemtypex)

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

dlnodetype*p,*s;

intj;

p=head;

j=0;

while(p!

=NULL&&j

{p=p->next;

  j++;}

if(j!

=i||i<1)

{printf("Error!

");

   returnFALSE;}

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

s->data=x;

s->prior=p->prior;/*图中步骤①*/

p->prior->next=s;/*图中步骤②*/

s->next=p;/*图中步骤③*/

p->prior=s;/*图中步骤④*/

returnTRUE;}

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

intDelete_dl(dlnodetype*head,inti)

{dlnodetype*p,*s;

intj;

p=head;

j=0;

while(p!

=NULL&&j

{p=p->next;

  j++;}

if(j!

=i||i<1)

{printf("Error!

");

  returnFALSE;}

s=p;

p->prior->next=p->next;/*图中步骤①*/

p->next->prior=p->prior;/*图中步骤②*/

free(s);

returnTRUE;}

P32【算法2.10多项式相加】

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

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

qa=Ah->next;qb=Bh->next;  /*qa和qb分别指向两个链表的第一结点*/

r=qa;Ch=Ah;  /*将链表Ah作为相加后的和链表*/

while(qa!

=NULL&&qb!

=NULL)  /*两链表均非空*/

{if(qa->exp==qb->exp)   /*两者指数值相等*/

     {x=qa->coef+qb->coef;

       if(x!

=0)

           {qa->coef=x;r->next=qa;r=qa;

            s=qb++;free(s);qa++;

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

       else{s=qa++;free(s);s=qb++;free(s);}/*相加后系数为零时*/

       }

elseif(qa->expexp){r->next=qa;r=qa;qa++;}/*多项式Ah的指数值小*/

      else{r->next=qb;r=qb;qb++;}    /*多项式Bh的指数值小*/

}

if(qa==NULL)r->next=qb;

elser->next=qa;        /*链接多项式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;

s->top=-1;

returnTRUE;

}

P39【算法3.2入栈操作】

intpush(sqstack*s,Elemtypex)

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

if(s->top>=MAXNUM-1)returnFALSE;/*栈满*/

s->top++;

s->stack[s->top]=x;

returnTRUE;

}

P39【算法3.3出栈操作】

Elemtypepop(sqstack*s)

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

Elemtypex;

if(s->top<0)returnNULL;  /*栈空*/

x=s->stack[s->top];

s->top--;

returnx;

}

P39【算法3.4取栈顶元素】

ElemtypegetTop(sqstack*s)

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

if(s->top<0)returnNULL;  /*栈空*/

return(s->stack[s->top]);

}

P40【算法3.5判栈空操作】

intEmpty(sqstack*s)

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

if(s->top<0)returnTRUE;

returnFALSE;

}

P40【算法3.6栈置空操作】

voidsetEmpty(sqstack*s)

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

s->top=-1;

}

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

Typedefstruct{

Elemtypestack[MAXNUM];

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

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

}dupsqstack;

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

intinitDupStack(dupsqstack*s)

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

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

s->lefttop=-1;

s->righttop=MAXNUM;

returnTRUE;

}

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

intpushDupStack(dupsqstack*s,charstatus,Elemtypex)

{*把数据元素x压入左栈(status='L')或右栈(status='R')*/

if(s->lefttop+1==s->righttop)returnFALSE;  /*栈满*/

if(status='L')s->stack[++s->lefttop]=x;   /*左栈进栈*/

   elseif(status='R')s->stack[--s->righttop]=x;/*右栈进栈*/

   elsereturnFALSE;      /*参数错误*/

returnTRUE;

}

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

ElemtypepopDupStack(dupsqstack*s,charstatus)

{/*从左栈(status='L')或右栈(status='R')退出栈顶元素*/

  if(status=='L')

   {if(s->lefttop<0)

       returnNULL;    /*左栈为空*/

elsereturn(s->stack[s->lefttop--]);    /*左栈出栈*/

}

  elseif(status=='R')

  {if(s->righttop>MAXNUM-1)

       returnNULL;    /*右栈为空*/

elsereturn(s->stack[s->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;/*申请一个结点*/

p->data=x;p->next=top;top=p;returnTRUE;

}

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

ElemtypepopLstack(slStacktype*top)

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

slStacktype*p;

Elemtypex;

if(top==NULL)returnNULL;   /*空栈*/

p=top;top=top->next;

x=p->data;free(p);returnx;

}

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

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

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

slStacktype*p;

if((p=(slStacktype*)malloc(sizeof(slStacktype)))==NULL)returnFALSE;/*申请一个结点*/

p->data=x;p->next=top[i];top[i]=p;returnTRUE;

}

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

ElemtypepopDupLs(slStacktype*top[M],inti)

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

slStacktype*p;

Elemtypex;

if(top[i]==NULL)returnNULL;   /*空栈*/

p=top[i];top[i]=top[i]->next;

x=p->data;free(p);returnx;

}

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

#defineMAXNUM40

#defineFALSE0

#defineTRUE1

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

typedefstruct{

charstack[MAXNUM];

inttop;}sqstack;

intinitStack(sqstack*s)

{/*初始化栈*/

s->top=-1;

returnTRUE;

}

intpush(sqstack*s,charx)

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

if(s->top>=MAXNUM-1)returnFALSE;/*栈满*/

   s->top++;

s->stack[s->top]=x;

returnTRUE;

}

charpop(sqstack*s)

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

charx;

if(s->top<0)returnNULL;   /*栈空*/

   x=s->stack[s->top];

s->top--;

returnx;

}

chargettop(sqstack*s)

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

  if(s->top<0)returnNULL;   /*栈空*/

return(s->stack[s->top]);

}

charprecede(charx1,charx2)

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

charresult='<';

charsting[2];

sting[0]=x2;

sting[1]='\0';

if(((x1=='+'||x1=='-')&&(strstr("+-)#",sting)!

=NULL))||

((x1=='*'||x1=='/')&&strstr("+-*/)#",sting)!

=NULL)||

(x1==')'&&strstr("+-*/)#",sting)!

=NULL))

  {result='>';}

elseif(x1=='('&&x2==')'||x1=='#'&&x2=='#')

  {result='=';}

elseif(x1==')'&&x2=='('||x1==

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

当前位置:首页 > 高等教育 > 农学

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

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