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