作业帮 > 综合 > 作业

C语言题目:插入后自动排序(掌握用穷举法进行比较、交换)

来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/10 18:40:53
C语言题目:插入后自动排序(掌握用穷举法进行比较、交换)
把一个整数插入到按由小到大排列的数列中,插入后仍然保持由小到大的顺序排列.
要求:用数据指针.
请写细致
我使用DEV C++6.0
由小到大的数列最好是手动输入后排序的
C语言题目:插入后自动排序(掌握用穷举法进行比较、交换)
输入 1 4 3 8 9 2
输出 1 2 3 4 8 9

可以接受输入,但是写死了只能输入6个数字

下面是代码:
#include <stdio.h>
#include <stdlib.h>

/*
把一个整数插入到按由小到大排列的数列中,插入后仍然保持由小到大的顺序排列.
要求:用数据指针.
*/

typedef struct _List {
\x09int value;
\x09struct _List *next;
} List;

void insertList( List ** l ,int v)
{
\x09if( *l==NULL)/*输入链表为空*/
\x09{
\x09\x09*l = malloc(sizeof(List));
\x09\x09memset(*l,0,sizeof(List) );
\x09\x09(*l)->value = v;
\x09}
\x09else
\x09{
\x09\x09List *tmp=*l,*next,*p,*prev=NULL;
\x09\x09while(tmp)
\x09\x09{
\x09\x09\x09next = tmp->next;
\x09\x09\x09if( (!next && tmp->value < v ) || (next && tmp->value<v && next->value > v ) )/*输入值需要插入到当前遍历节点之后*/
\x09\x09\x09{
\x09\x09\x09\x09p= malloc(sizeof(List));
\x09\x09\x09\x09memset(p,0,sizeof(List) );
\x09\x09\x09\x09p->value = v;
\x09\x09\x09\x09tmp->next = p;
\x09\x09\x09\x09p->next = next;
\x09\x09\x09\x09return;
\x09\x09\x09}
\x09\x09\x09else if (tmp->value>v )/*输入值需要插入到当前遍历节点之前*/
\x09\x09\x09{
\x09\x09\x09\x09p= malloc(sizeof(List));
\x09\x09\x09\x09memset(p,0,sizeof(List) );
\x09\x09\x09\x09p->value = v;
\x09\x09\x09\x09if(!prev)
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09p->next = tmp;
\x09\x09\x09\x09\x09*l = p;
\x09\x09\x09\x09\x09return;
\x09\x09\x09\x09}
\x09\x09\x09\x09else
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09prev->next = p;
\x09\x09\x09\x09\x09p->next = tmp;
\x09\x09\x09\x09\x09return;
\x09\x09\x09\x09}
\x09\x09\x09}
\x09\x09\x09else
\x09\x09\x09{
\x09\x09\x09\x09prev = tmp;
\x09\x09\x09\x09tmp = next;
\x09\x09\x09}
\x09\x09}
\x09}
\x09return;
}

int main()
{
\x09int input [6] ;
\x09/*1 4 3 8 9 2*/
\x09List * l = NULL,*tmp;
\x09int i;
INPUT:\x09printf("pls input 6 number:");
\x09i = scanf("%d %d %d %d %d %d",input,input+1,input+2,input+3,input+4,input+5);
\x09if(i!=6)
\x09\x09goto INPUT;
\x09
\x09for(i=0;i<6;++i)
\x09\x09insertList(&l,input[i]);
\x09\x09
\x09tmp = l;
\x09while(tmp)
\x09{
\x09\x09printf("%d ",tmp->value);
\x09\x09tmp = tmp->next;
\x09}
\x09printf("\n");
\x09return 0;
}
再问: 非常抱歉,这个里边有数据结构的内容,我做的是大一C语言的,这个太明显会露馅。能提供一个简便的方法吗,可以不用自己输入已有的数列。
再答: 输出:19 22 27 29 30 40 42 45
这次用的是数组,数组程序也不好懂,因为需要将数组内容后移,没有指针移动起来简单。

不过用数组的确有很多比较和交换,比较符合出题人的意图#include <stdio.h>
#include <stdlib.h>

void insert(int *a,int b)
{
int i,*p;
if(*a == -1)/*空数组*/
{
*a=b;
return;
}

while( *a!=-1)/*-1表示位置没有放数字*/
{
if( (*(a+1)==-1 && *a <b ) || ( (*(a+1)!=-1 && *a <b && *(a+1)>b) ) )/*需要插入到当前数组下标后面*/
{
p = a+1;
while(*p++ != -1)/*移动到最后一个元素后面*/
;
while( p-- != a+1)/*元素后移*/
*p = *(p-1);
*(a+1) = b;
return;
}
else if( *a > b)/*需要插入到当前数组下标前面*/
{
p = a;
while(*p++ != -1)/*移动到最后一个元素后面*/
;
while( p-- != a)/*元素后移*/
*p = *(p-1);
*a=b;
return;
}
a++;
}
return;
}

int main()
{
int input[6] = { 22,45,30,42,19,29 };
int output[100] ;
int i;

memset(output,0xff,100*sizeof(int));/*-1表示位置没有放数字*/

output[0] = 27;
output[1] = 40;

for(i=0;i<6;++i)
insert(output,input[i]);

for(i=0;output[i]!=-1;++i)
printf("%d ",output[i]);
}