题目
解决代码及点评
/*
功能:插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的:设手中原有3张牌已排好序,抓1张新牌,若这张新牌的次序在原来的第2张牌之后,第3张牌之前,那么就把这张新牌放在第3张牌的位置上,原来的第3张改为第4张,然后再抓新牌。按着这个算法,编写一个排序程序。注:开始一张牌也没有,从第一张牌开始抓起。时间:23:34 2013/10/24
*/#include<stdio.h>
#include<stdlib.h>struct card
{int num;struct card *pNext;
};typedef struct card CARD;CARD *initList(int); //链表初始化声明,第一张牌
void insertList(CARD *p,int n); //在第i个元素后插入
void showAll(CARD *p);void main()
{CARD *pHead=initList(2); //头结点创建,next=NullinsertList(pHead,4);insertList(pHead,3);insertList(pHead,1);showAll(pHead);system("pause");
}void showAll(CARD *p)
{do {printf("%d \n",p->num);} while((p->pNext!=NULL) && (p=p->pNext));
}void insertList(CARD *p,int n)
{CARD *pNew=(CARD *)malloc(sizeof(CARD)); //分配新结点if(pNew==NULL)return;if(n<p->num) //判断n是否小于头结点 如果小于,将头结点的值与n交换{int temp=p->num;p->num=n;n=temp;}CARD *Prior=p; //用来保存前结点while(n>p->num && p->pNext!=NULL) //当n大于当前结点时,指针向后移,知道小于当前结点或next为NULL时终止{Prior=p; //循环结束后,为当前结点的前结点p=p->pNext;}if(n<p->num) //当n<小于当前结点,则在当前结点前插入n{Prior->pNext=pNew;pNew->pNext=p;pNew->num=n;}if(p->pNext==NULL && n>p->num) //假设牌码最大,则在链表尾部插入{p->pNext=pNew;pNew->pNext=NULL;pNew->num=n;}}
CARD *initList(int n)
{CARD *p=(CARD *)malloc(sizeof(CARD));if(p==NULL)return NULL; //分配失败返回空p->num=n;p->pNext=NULL;return p;
}
代码编译以及运行
由于资源上传太多,资源频道经常被锁定无法上传资源,同学们可以打开VS2013自己创建工程,步骤如下:
1)新建工程
2)选择工程
3)创建完工程如下图:
4)增加文件,右键点击项目
5)在弹出菜单里做以下选择
6)添加文件
7)拷贝代码与运行
程序运行结果
代码下载
http://download.csdn.net/detail/yincheng01/6681845
解压密码:c.itcast.cn