小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

基于visual Studio2013解决C语言竞赛题之1049抓牌排序






题目


解决代码及点评

/*
功能:插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的:
	  设手中原有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=Null
	
	insertList(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







posted on 2013-12-09 21:29  牛栏山1  阅读(69)  评论(0编辑  收藏  举报

导航