数据结构核心算法大全.docx
- 文档编号:2869533
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:183
- 大小:59.38KB
数据结构核心算法大全.docx
《数据结构核心算法大全.docx》由会员分享,可在线阅读,更多相关《数据结构核心算法大全.docx(183页珍藏版)》请在冰豆网上搜索。
数据结构核心算法大全
线性表
单链表逆置
//已知单链表H,写一个算法将其逆置
//H->head->32->63->18->50->26->NULL
#include
#include
typedefstructnode
{
chardata;//data为结点数据信息
structnode*next;//next为指向后继结点的指针
}LNode;//单链表数据类型
LNode*CreateLinkList()//生成单链表
{
LNode*head,*p,*q;
charx;
head=(LNode*)malloc(sizeof(LNode));//生成头结点
head->next=NULL;
p=head;
q=p;//q始终指向链尾结点
printf("Inputanycharstring:
\n");
scanf("%c",&x);
while(x!
='\n')
{
p=(LNode*)malloc(sizeof(LNode));
p->data=x;
p->next=NULL;
q->next=p;//在链尾插入
q=p;
scanf("%c",&x);
}
returnhead;//返回指向单链表的头指针head
}
voidConvert(LNode*H)//单链表的逆置
{
LNode*p,*q;
p=H->next;//p指向剩余结点链表的第一个数据结点
H->next=NULL;//新链表H初始为空
while(p!
=NULL)
{
q=p;//从剩余结点链表中取出第一个结点
p=p->next;//p继续指向剩余结点链表新的第一个数据结点
q->next=H->next;//将取出的结点*q插入到新链表H的链首
H->next=q;
}
}
voidmain()
{
LNode*A,*p;
A=CreateLinkList();//生成单链表A
Convert(A);//单链表逆置
p=A->next;//输出逆置后的单链表
while(p!
=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
双链表合并
//对两个元素递增有序的单链表A和B,编写算法将A、B合并成一个按元素递减有序的单链表C,要求算法使用A\B中原有的结点,不允许增加新结点
#include
#include
typedefstructnode
{
intdata;//data为结点的数据信息
structnode*next;//next为指向后继结点的指针
}LNode;
LNode*CreateLinkList()//生成单链表
{
LNode*head,*p,*q;
inti,n;
head=(LNode*)malloc(sizeof(LNode));//生成头结点
head->next=NULL;
p=head;
q=p;//指针q始终指向链尾结点
printf("Inputlengthoflist:
\n");
scanf("%d",&n);//读入节点数据
printf("Inputdataoflist:
\n");
for(i=1;i<=n;i++)//生成链表的数据结点
{
p=(LNode*)malloc(sizeof(LNode));//申请一个节点空间
scanf("%d",&p->data);
p->next=NULL;
q->next=p;//在链尾插入
q=p;
}
returnhead;//返回单链表的头指针head
}
voidMerge(LNode*A,LNode*B,LNode**C)//将升序链表A\B合并成降序链表C
{
LNode*p,*q,*s;
p=A->next;//p始终指向链表A的第一个未比较的数据结点
q=B->next;//q时钟指向链表B的第一个未比较的数据节点
*C=A;//生成的链表的*C的头结点
(*C)->next=NULL;
free(B);//回收链表B的头结点空间
while(p!
=NULL&&q!
=NULL)//将A、B两链表中当前比较节点中值小者赋给*S
{
if(p->data
{
s=p;
p=p->next;
}
else
{
s=q;
q=q->next;
}
s->next=(*C)->next;//用头插法将结点*S插到链表*C的头结点之后
(*C)->next=s;
}
if(p==NULL)//如果指向链表A的指针*P为空,则使*P指向链表B
p=q;
while(p!
=NULL)//将*P所指链表中剩余结点依次摘下插入的链表C的链首
{
s=p;
p=p->next;
s->next=(*C)->next;
(*C)->next=s;
}
}
voidprint(LNode*p)//输出单链表
{
p=p->next;
while(p!
=NULL)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
voidmain()
{
LNode*A,*B,*C;
printf("Inputdataoflist:
\n");
A=CreateLinkList();//生成单链表A
printf("OutputlistA:
\n");
print(A);//输出单链表A
printf("InputdataofB:
\n");
B=CreateLinkList();
printf("OutputlistofB:
\n");
print(B);
printf("MakelistC:
\n");
Merge(A,B,&C);//将升序链表A、B合并成降序链表C
printf("OutputlistofC:
\n");
print(C);
}
静态链表
#include
#include
#defineMAXSIZE30
typedefstruct
{
chardata;//data为结点数据信息
intcursor;//cursor标示直接后继结点
}SNode;
voidInsertList(SNodeL[],inti,charx)//在静态链表中插入元素
{
intj,j1,j2,k;
j=L[0].cursor;//j指向第一个数据结点
if(i==1)//作为第一个数据结点插入
{
if(j==0)//静态链表为空
{
L[1].data=x;//将x放入结点L[1]中
L[0].cursor=1;//头指针cursor指向这个新插入的结点
L[1].cursor=0;//置链尾标示
}
else
{
k=j+1;
while(k!
=j)//在数组中循环查找存放x的位置
if(L[k].cursor==-1)//找到空位置
break;
else
k=(k+1)%MAXSIZE;//否则查找下一个位置
if(k!
=j)//在数组中查找一个空位子来存放x
{
L[k].data=x;
L[k].cursor=L[0].cursor;//将其插入到静态链表表头
L[0].cursor=k;
}
else
printf("Listoverflow!
\n");//链表已满无法插入
}
}
else//不是作为第一个结点插入时
{
k=0;
while(k =0)//查找第i-1个结点,j不等于0则表示未到链尾 { k++; j=L[j].cursor; } if(j==0)//查完整个静态链表未找到第i-1个结点,即链表长度小于i-1个结点 printf("Inserterror\n"); else { j1=j;//找到第i-1个结点 j2=L[j].cursor;//用j2保存原L[j].cursor值,此值为第i个结点的位置值 k=j+1; while(k! =j)//在数组中循环查找存放x的位置 if(L[k].cursor==-1)//找到空位置 break; else k=(k+1)%MAXSIZE;//否则查找下一个位置 if(k! =j)//在数组中找到一个空位置来存放x { L[k].data=x; L[j1].cursor=k;//作为第i个结点链入到静态链表 L[k].cursor=j2;//新结点之后再连接上原第i个结点 } else printf("Listoverflow! \n");//链表已满,无法插入 } } } voidprint(SNode*L)//输出静态链表 { inti; i=L[0].cursor;//从静态链表的表头元素开始输出 while(i! =0) { printf("%c",L[i].data); i=L[i].cursor; } printf("\n"); } voidmain() { SNodeL[MAXSIZE]; inti; charx; for(i=1;i L[i].cursor=-1; L[0].cursor=0;//静态链表初始为空标志 i=1; printf("Inputelementoflist\n");//建立静态链表 scanf("%c",&x); while(x! ='\n'); { InsertList(L,i,x); i++; scanf("%c",&x); } printf("Inputsiteandelementofinsert\n"); scanf("%d.%c",&i,&x);//输入要插入的元素的位置 InsertList(L,i,x);//在静态链表中插入元素 printf("Outputlist: \n"); print(L);//输出静态链表 } 链表的基本运算 #include #include typedefstructnode { chardata;//data为结点数据信息 structnode*next;//next为指向后继结点的指针 }LNode;//单链表结点类型 LNode*CreateLinkList()//在表尾生成单链表 { LNode*head,*p,*q; charx; head=(LNode*)malloc(sizeof(LNode));//生成头结点 head->next=NULL; p=he
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 核心 算法 大全
![提示](https://static.bdocx.com/images/bang_tan.gif)