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

2018-12-19 22:03

数据结构源代码归纳(一)

2008年08月01日 星期五 23:46 第一章 绪论 P8

例: 计算f=1!+2!+3!+…+n!,用C语言描述。 void factorsum(n) int n; {

int i,j; int f,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 顺序表的插入】

int Insert(Elemtype List[],int *num,int i,Elemtype x)

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

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

{printf(\ /*插入位置出错*/ return FALSE;}

if (*num>=MAXNUM-1) {printf(\

return FALSE;} /*表已满*/ for (j=*num;j>=i;j--)

List[j+1]=List[j]; /*数据元素后移*/ List[i]=x; /*插入x*/ (*num)++; /*长度加1*/ return TRUE;}

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

int Delete(Elemtype List[],int *num,int i)

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

int j;

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

{printf(\删除位置出错!*/ for(j=i+1;j<=*num;j++)

List[j-1]=List[j]; /*数据元素前移*/ (*num)--; /*长度减1*/ return TRUE; }

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

void merge(Elemtype La[],Elemtype Lb[],Elemtype **Lc) { int i,j,k;

int La_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

} /*将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例如:下面定义的结点类型中,数据域包含三个数据项:学号、姓名、成绩。 Struct student

{ char num[8]; /*数据域*/ har name[8]; /*数据域*/ int score; /*数据域*/ struct student *next; /*指针域*/ }

P21单链表结点结构定义为: Typedef struct slnode { Elemtype data;

struct slnode *next; }slnodetype;

slnodetype *p,*q,*s;

P21 【算法2.3 单链表的初始化】 int Initiate(slnodetype * *h)

{ if((*h=(slnodetype*)malloc(sizeof(slnodetype)))==NULL) return FALSE; (*h)->next=NULL;

return TRUE; }

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 单链表的前插入】 int insert(slnodetype *h,int i,Elemtype x)

{/*在链表h中,在第i个数据元素前插入一个数据元素x */ slnodetype *p,*q,*s; int j=0; p=h;

while(p!=NULL&&jnext;j++; /*寻找第i-1个结点*/ } if ( j!=i-1) {printf(\ /*插入位置错误*/}

if ((s=(slnodetype*)malloc(sizeof(slnodetype)))==NULL) return FALSE; s->data=x;

s->next=p->next; q->next=s; return TRUE;}

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

#include \#include \struct slnode {int data;

struct slnode *next;} /*定义结点类型*/ main() {int x,y,d;

struct slnode *head,*p,*q,*s; head=NULL; /*置链表空*/ q=NULL;

scanf(\输入链表数据元素*/

while(d>0)

{p=(struct slnode*)malloc(sizeof(struct slnode)); /*申请一个新结点*/ p->data=d;

p->next=NULL;

if(head==NULL) head=p; /*若链表为空,则将头指针指向当前结点p*/ else q->next=p; /*链表不为空时,则将新结点链接在最后*/ q=p; /*将指针q指向链表的最后一个结点*/ scanf(\

scanf(\

s=(struct slnode*)malloc(sizeof(struct slnode)); 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 单链表的删除】 int Delet(slnodetype *h,int i)

{ /*在链表h中删除第i个结点*/ slnodetype *p,*s; int j; p=h;j=0;

while(p->next!=NULL&&j

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

{printf(\删除位置错误!*/ return FALSE; } s=p->next;

p->next=p->next->next; /*删除第i个结点*/ free(s); /*释放被删除结点空间*/ return TRUE; }

P25例:假设已有线性链表La,编制算法将该链表逆置。 void converse(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为新链表的尾指针。 Void merge(slnodetype *La,slnodetype *Lb) { slnodetype *p; p=La->next;

Lb->next= La->next; La->next=p->next; free(p); }

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

int insert_dul(dlnodetype *head,int i,Elemtype x)

{/*在带头结点的双向链表中第i个位置之前插入元素x*/ dlnodetype *p,*s; int j; p=head; j=0;

while (p!=NULL&&jnext; j++; } if(j!=i||i<1)

{ printf(\ return FALSE;}

if((s=(dlnodetype *)malloc(sizeof(dlnodetype)))==NULL) return FALSE; s->data=x;

s->prior=p->prior; /*图中步骤①*/ p->prior->next=s; /*图中步骤②*/ s->next=p; /*图中步骤③*/ p->prior=s; /*图中步骤④*/ return TRUE;}

P30【算法2.9 双向链表的删除】 int Delete_dl(dlnodetype *head,int i) { dlnodetype *p,*s; int j; p=head; j=0;

while (p!=NULL&&jnext; j++; } if(j!=i||i<1)

{ printf(\


数据结构源代码(C语言描述).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:不应该为了公共财产而牺牲个人生命

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: