C算法Common.docx

上传人:b****6 文档编号:7281553 上传时间:2023-01-22 格式:DOCX 页数:13 大小:16.97KB
下载 相关 举报
C算法Common.docx_第1页
第1页 / 共13页
C算法Common.docx_第2页
第2页 / 共13页
C算法Common.docx_第3页
第3页 / 共13页
C算法Common.docx_第4页
第4页 / 共13页
C算法Common.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

C算法Common.docx

《C算法Common.docx》由会员分享,可在线阅读,更多相关《C算法Common.docx(13页珍藏版)》请在冰豆网上搜索。

C算法Common.docx

C算法Common

Common.h(第1页)

#include

#include

#include

#defineOK1

#defineERROR0

#defineTRUE1

#defineFALSE0

Dliklist.h

typedefcharElemType;

typedefstructDNode

{

ElemTypedata;

structDNode*prior,*next;

}DNode,*DoubleList;

voidCreateList(DoubleListL)

/*通过键盘输入表中元素值,利用尾插法建单链表,并返回该单链表头指针L*/

{

DNode*r,*s;

charc;

intflag=1;/*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/

L->next=L;

L->prior=L;

r=L;

while(flag)

{

c=getchar();

if(c!

='$')

{

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

s->data=c;

r->next=s;

s->prior=r;

r=s;

}

else

{

flag=0;

r->next=L;

L->prior=r;

}

}/*while*/

}

#include"common.h"(第2页)

#include"dlinklist.h"

intDlinkDel(DoubleListL,inti,ElemType*e)

{

DNode*p;

intk;

p=L;

k=0;/*从"头"开始,查找第i个结点*/

while(p->next!

=L&&k

{

p=p->next;

k=k+1;

}

if(p->next==L)

{

returnERROR;

}

else

{

*e=p->data;

p->prior->next=p->next;

p->next->prior=p->prior;

free(p);

returnOK;

}

}

voidmain()

{

DoubleListl;

DNode*p;

inti;

intflag=0;

char*e;

l=(DNode*)malloc(sizeof(DNode));

printf("请输入链表数据:

\n");

CreateList(l);

p=l->next;

while(p!

=l)

{

printf("%c\n",p->data);

p=p->next;

}

printf("请输入要删除的位置:

\n");

scanf("%d",&i);

e=(char*)malloc(sizeof(char));

flag=DlinkDel(l,i,e);

if(flag==1)

{

printf("删除的元素是:

%c\n",*e);

}

else

printf("删除位置不合理!

");

}

Crlinklist.h(第3页)

typedefintElemType;

typedefstructNode/*结点类型定义*/

{

ElemTypedata;

structNode*next;

}Node,*LinkList;/*LinkList为结构指针类型*/

LinkListcrt_linklist()/*创建尾指针表示的循环链表*/

{

LinkListl;

intnum;

Node*p;

l=(Node*)malloc(sizeof(structNode));

l->data=-1;

l->next=l;

printf("请输入循环链表的元素(以-1结束):

\n");

scanf("%d",&num);

while(num!

=-1)

{

p=(Node*)malloc(sizeof(structNode));

p->data=num;

p->next=l->next;

l->next=p;

scanf("%d",&num);

}

p=l;

while(p->next!

=l)

{

p=p->next;

}

returnp;

}

#include"common.h"(第4页)

#include"crlinklist.h"

LinkListmerge_2(LinkListRA,LinkListRB)

{/*此算法将两个采用尾指针的循环链表首尾连接起来*/

Node*p;

p=RA->next;/*保存链表RA的头结点地址*/

RA->next=RB->next->next;/*链表RB的开始结点链到链表RA的终端结点之后*/

free(RB->next);/*释放链表RB的头结点*/

RB->next=p;/*链表RA的头结点链到链表RB的终端结点之后*/

returnRB;/*返回新循环链表的尾指针*/

}

voidmain()

{

LinkListla,lb,lc;

Node*p;

printf("建立循环链表A,请输入数据!

:

\n");

la=crt_linklist();

p=la->next->next;

while(p!

=la->next)

{

printf("%d\n",p->data);

p=p->next;

}

printf("建立循环链表B,请输入数据!

:

\n");

lb=crt_linklist();

p=lb->next->next;

while(p!

=lb->next)

{

printf("%d\n",p->data);

p=p->next;

}(第5页)

lc=merge_2(la,lb);

printf("合并后的循环链表为:

\n");

p=lc->next->next;

while(p!

=lc->next)

{

printf("%d\n",p->data);

p=p->next;

}

}

dliklist.h

typedefcharElemType

typedefstructDNode

{

ElemTypedata;

structDNode*prior,*next;

}DNode,*DoubleList;

voidCreateList(DoubleListL)

/*通过键盘输入表中元素值,利用尾插法建单链表,并返回该单链表头指针L*/

{

DNode*r,*s;

charc;

intflag=1;/*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/

L->next=L;

L->prior=L;

r=L;

while(flag)

{

c=getchar();

if(c!

='$')

{

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

s->data=c;

r->next=s;

s->prior=r;

r=s;

}

else

{

flag=0;

r->next=L;

L->prior=r;

}

}/*while*/

}

#include"common.h"(第6页)

#include"dlinklist.h"

intDlinkIns(DoubleListL,inti,ElemTypee)

{

DNode*s,*p;

intk;

p=L;

k=0;/*从"头"开始,查找第i-1个结点*/

while(p->next!

=L&&k

{

p=p->next;

k=k+1;

}/*查找第i-1结点*/

if(p->next==L)/*如当前位置p为空表已找完还未数到第i个,说明插入位置不合理*/

{

printf("插入位置不合理!

");

returnERROR;

}

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

if(s)

{

s->data=e;

s->prior=p->prior;

p->prior->next=s;

s->next=p;

p->prior=s;

returnOK;

}

else

returnERROR;

}

voidmain()

{

DoubleListl;

DNode*p;

inti;

chare;

l=(DNode*)malloc(sizeof(DNode));

printf("请输入双向链表数据!

:

\n");

CreateList(l);

p=l->next;

while(p!

=l)

{

printf("%c\n",p->data);

p=p->next;

}

printf("情输入插入位置和元素值:

\n");

scanf("%d,%c",&i,&e);

DlinkIns(l,i,e);

printf("插入后的链表为:

\n");

p=l->next;

while(p!

=l)

{

printf("%c\n",p->data);

p=p->next;

}

}

Linklist(第7页)

typedefintElemType;

typedefstructNode/*结点类型定义*/

{

ElemTypedata;

structNode*next;

}Node,*LinkList;/*LinkList为结构指针类型*/

voidCreateFromTail(LinkListL)

{

Node*r,*s;

charc;

intflag=1;/*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/

r=L;/*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/

while(flag)/*循环输入表中元素值,将建立新结点s插入表尾*/

{

scanf("%d",&c);

if(c!

=-1)

{

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

s->data=c;

r->next=s;

r=s;

}

else

{

flag=0;

r->next=NULL;/*将最后一个结点的next链域置为空,表示链表的结束*/

}

}

}

#include"common.h"(第8页)

#include"linklist.h"

LinkListMergeLinkList(LinkListLA,LinkListLB)

/*将递增有序的单链表LA和LB合并成一个递增有序的单链表LC*/

{

Node*pa,*pb;

Node*r;

LinkListLC;

/*将LC初始置空表。

pa和pb分别指向两个单链表LA和LB中的第一个结点,r初值为LC*/

pa=LA->next;

pb=LB->next;

LC=LA;

LC->next=NULL;

r=LC;

/*当两个表中均未处理完时,比较选择将较小值结点插入到新表LC中。

*/

while(pa!

=NULL&&pb!

=NULL)

{

if(pa->data<=pb->data)

{

r->next=pa;

r=pa;

pa=pa->next;

}

else

{

r->next=pb;

r=pb;

pb=pb->next;

}(第9页)

}

if(pa)/*若表LA未完,将表LA中后续元素链到新表LC表尾*/

r->next=pa;

else/*否则将表LB中后续元素链到新表LC表尾*/

r->next=pb;

free(LB);

return(LC);

}

 

voidmain()

{

LinkListla,lb,lc;

Node*p;

la=(Node*)malloc(sizeof(Node));

la->next=NULL;

printf("请输入单链表A中的元素(以-1结束!

):

\n");

CreateFromTail(la);

printf("单链表A中元素为:

\n");

p=la->next;

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

printf("\n");

printf("请输入单链表B中的元素(以-1结束!

):

\n");

lb=(Node*)malloc(sizeof(Node));

lb->next=NULL;

CreateFromTail(lb);

printf("单链表B中元素为:

\n");

p=lb->next;

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

printf("\n");

lc=MergeLinkList(la,lb);

printf("单链表C中元素为:

\n");

p=lc->next;

while(p!

=NULL)

{

printf("%d",p->data);

p=p->next;

}

}(第10页)

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

当前位置:首页 > 医药卫生 > 预防医学

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

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