找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2402|回复: 0
打印 上一主题 下一主题
收起左侧

利用二级指针实现单链表相邻结点交换

[复制链接]
跳转到指定楼层
楼主
ID:125005 发表于 2016-6-4 01:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用冒泡法对单链表进行排序需要交换两个相邻结点,利用二级指针可以很方便地解决结点交换的问题
下面我们生成一个链表,每个结点储存一个随机值,然后对该链表进行排序。其中排序算法的实现过程也同时实现了相邻两个结点的交换。
#include  < stdio.h >
#include < stdlib.h >
#include < time.h >
#define   FALSE 0
#define TRUE 1

typedef struct NODE{ //链表节点的结构体声明
struct NODE *link;
int value;
}Node;
int sort(register Node **head,int length); //排序函数的原型声明

int main(void)
{
int i; //利用i控制循环次数
Node *head=(Node *)malloc(sizeof(Node)); //申请头结点并让头指针指向头结点
Node *p=head; //利用p使当前结点与新节点相连接
srand( (unsigned)time( NULL ) );
for(i=0;i<20;i++) //单链表创建
{
p->value=rand()0+1; //生成1~100的随机数
p->link=(Node *)malloc(sizeof(Node)); //使当前结点与新节点相连
p=p->link; //p指向新节点
}
p->value=rand()0+1; //对尾结点赋值
p->link=NULL;
p=head;  
printf("排序前储存的数值为:"); //打印排序前链表储存的数值
while(p!=NULL)
{
printf("%d ",p->value);
p=p->link;
}  
sort(&head,20); //调用排序函数对链表排序
p=head;  
printf("\n排序后储存的数值为:"); //打印排序后链表储存的数值
while(p!=NULL)
{
printf("%d ",p->value);
p=p->link;
}
free(head);
return 0;
}

int sort(register Node **head,int length) //定义三个二级指针实现结点交换
{
register Node **prior=head;  
register Node **current=&((*prior)->link);
register Node **later=&((*current)->link);
Node *temp1;
Node **temp2;
int i;
for(i=0;i
{
while(later!=NULL)  
{
if((*prior)->value>(*current)->value)  
{
temp1=*prior; //实现结点交换
*prior=*current;
*current=*later;
*later=temp1;
temp2=current; //调整三个指针的位置
current=later;
later=temp2;
}
if(*later==NULL) //最后一次交换已完成,*later为NULL,不能执行下面代码,故结束循环
{
break;
}
later=&((*later)->link); //三个指针均向后移动一个结点
current=&((*current)->link);
prior=&((*prior)->link);
}
prior=head; //三个指针均移回链表起始处
current=&((*prior)->link);
later=&((*current)->link);
}
}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表