问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构编程--查找与排序 题

发布网友 发布时间:2022-04-22 11:08

我来回答

2个回答

热心网友 时间:2023-10-12 00:21

#include <stdlib.h>
#include <stdio.h>

typedef struct node
{
int data;
struct node* next;
struct node* pre;
}node,*link;
int droplink( link &L );
//检查表是否存在,是返回true,否返回false
bool checklink( link &L )
{
if ( L==NULL )
{
return false;
}
else
{
return true;
}
}

//新建一个结点,以data作为它的值,返回指向这个结点的指针
link createnode( int data )
{
link p;
if ( (p = (link)malloc(sizeof(node)))==NULL )
{
printf("malloc failed!@createnode\n");
return NULL;
}
else
{
p->data = data;
p->next = NULL;
p->pre = NULL;
return p;
}
}

//创建一个带头结点的链表,成功返回0,失败返回-1
int create( link &L )
{
if ( checklink(L) )
{
printf( "链表已经存在,先销毁再创建!\n" );
droplink( L );
}
if ( (L = (link)malloc(sizeof(node)))==NULL )
{
printf("malloc failed!\n");
return -1;
}
L->next = NULL;
L->pre = NULL;
return 0;
}
//统计链表长度,成功返回链表长度,失败返回-1
int getlength( link &L )
{
int length = 0;
link p = L;
while ( p->next != NULL )
{
length++;
p = p->next;
}
return length;
}

//根据值查询结点
link findpos( link &L, int data )
{
if ( !checklink(L) )
{
printf( "无此链表\n" );
return NULL;
}
link p = L;
while ( p!=NULL )
{
if ( p->data == data )
{
return p;
}
p = p->next;
}
}
//找出第pos位置上的结点,返回指向这个结点的指针
link findnode( link &L, int pos )
{
if ( !checklink(L) )
{
printf( "无此链表\n" );
return NULL;
}
if ( pos <= 0 )
{
printf("位置过小!@findnode\n");
return NULL;
}
link p = L;
for ( int i=0; i<pos; i++ )
{
if ( p==NULL )
{
printf("位置超出链表长度!@findnode\n");
return NULL;
}
p = p->next;
}
return p;
}
//把n插入至rear之后,成功返回0,失败返回-1
int pushback( link &L, link &n )
{
if ( !checklink(L) )
{
printf( "无此链表\n" );
return -1;
}
int length = getlength(L);
link rear = NULL;
if ( length==0 )
{
rear = L;
}
else
{
rear = findnode( L, length );
}
rear->next = n;
n->pre = rear;
rear = n;
return 0;
}

//把n插入至L的第pos位(0代表头结点),成功返回0,失败返回-1
int insert( link &L, link &n, int pos )
{
if ( !checklink(L) )
{
printf( "无此链表\n" );
return -1;
}
link p = findnode( L, pos );
if ( p==NULL )
{
printf( "查找结点失败!@insert\n" );
return -1;
}
n->next = p->next;
p->next = n;
n->pre = p;
n->next->pre = n;
return 0;
}

//把L链表第pos位置上的结点删除 (0代表头结点),成功返回0,失败返回-1
int delnode( link &L, int pos )
{
if ( !checklink(L) )
{
printf( "无此链表\n" );
return -1;
}
link p = findnode( L, pos );
if ( p==NULL )
{
printf( "查找结点失败!@delnode\n" );
return -1;
}
p->pre->next = p->next;
p->next->pre = p->pre;
free( p );
p = NULL;
return 0;
}

//销毁链表L 成功返回0,失败返回-1
int droplink( link &L )
{
if ( !checklink(L) )
{
printf( "无此链表\n" );
return -1;
}
int length = getlength(L);
while ( length>0 )
{
delnode( L, length );
length = getlength(L);
}
free( L );
L = NULL;
return 0;
}

//对链表进行排序 type为1时是升序排列,为-1时为降序 (冒泡排序法)
void sort( link &L, int type )
{
int length = getlength( L );
if ( length <= 0 )
{
printf("升序过小!\n");
return;
}
switch( type )
{
case 1: printf( "升序排列链表!\n" );break;
case -1: printf( "降序排列链表!\n" );break;
default: printf( "参数错误!\n" );return;
}
for( int i=1; i<length; i++ )
{
for( int j=1; j<length; j++ )
{
printf("i=%d,j=%d,",i,j);
printf("findnode(L,j)->data =%d, findnode(L,j+1)->data=%d\n",findnode(L,j)->data,findnode(L,j+1)->data);
if ( type == -1 )
{

//降序
if ( findnode(L,j)->data < findnode(L,j+1)->data )
{

int t = findnode(L,j)->data;
findnode(L,j)->data = findnode(L,j+1)->data;
findnode(L,j+1)->data = t;
}
}
else
{
//升序
if ( findnode(L,j)->data > findnode(L,j+1)->data )
{
int t = findnode(L,j)->data;
findnode(L,j)->data = findnode(L,j+1)->data;
findnode(L,j+1)->data = t;
}
}
}
}
}

void output( link &L )
{
link p=L->next;
int i=0;
while ( p!=NULL )
{
printf( "[%d]=\t%d\n", i, p->data );
i++;
p=p->next;
}
}

main()
{
int length;
link L = NULL;
//新建链表
create( L );
printf("===输入数据===\n");
printf("请输入链表结点数量:");
scanf( "%d", &length );
if ( length<=0 )
{
printf("数量错误!退出程序\n");
return -1;
}
int i=0;
int data;
link tmp = NULL;

while ( i!=length )
{
printf("请输入data值:" );
scanf( "%d", &data );
tmp = createnode(data);
pushback( L, tmp );
i++;
}
output(L);
printf("===插入新节点===\n");
printf("请输入data值:" );
scanf( "%d", &data );
tmp = createnode(data);
insert( L, tmp, 2 );
output(L);
printf("===查询节点===\n");

printf("请输入要查询的data值:" );
scanf( "%d", &data );
findpos( L, data );

printf("===链表长度为%d===\n", getlength(L));

printf("升序排序后链表为:\n");
sort(L, 1 );
output(L);
printf("降序排序后链表为:\n");
sort(L,-1);
output(L);
getchar();

}

热心网友 时间:2023-10-12 00:22

给200分我替你写
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
移动3g手机品牌移动3g手机品牌有哪些 ...自交、测交,除此之外还有什么类型? 这些类型具体的定义是什么?要准... 侧交与回交的含 什么是侧交和回交 笔记本电脑帽子怎么安装笔记本电脑键帽可以更换吗 怎样让孩子借不到网贷 合肥本田缤智价格多少钱 天官赐福中花城的通灵口令是什么 oppor7007换的新屏点不动,但会亮 旧屏却可以点动 怎么回事 oppor7007屏幕怎么设置自己的照片?搞了怎么是在开锁的页面上,进入主屏... 佳能lbp2900墨盒怎么取下来 佳能269DW怎么取粉盒? 佳能打印机墨盒怎么拆 佳能lbp2900墨盒怎么取下来 要详细再详细 急出一身汗来了 我要取墨合,请问怎样打开佳能打印机的外壳? 佳能连供怎么吸墨 求《海底两万里》每一章节的读后感!50字! 海底两万里21~24章读后感200字? 海底两万里每章的感悟三百字 海底两万里1-5章主要内容和体会缩写(150字左右) WPSPPT如何插入背景图片呢,并且怎样改变图片大小呢 PPT背景图片设置,如何改变大小呢,使用wps啊 现代修仙耽美小说,或者是丧尸耽美小说 求名字! 这个是什么动漫里的呀,看着是国漫? 求轻小说名字(根据描述来推断轻小说名) 早一点学编程应该不会影响学习吧? 求师徒恋的小说! ! ! (女师男徒) 我儿子高二,现在为了学编程每晚上2一3点睡,这样严重影响学习,怎么办才好? 女主有红莲业火的小说 计算机软件基础 查找和排序中的习题 求数据结构大神们帮我做看下这个查找和排序题目、 java上关于排序和查找的题目能解出来吗 (求救)用C语言编写——排序查找,题目如下。 数据结构:查找与排序基础问题 C语言的题用函数实现数组数据的增加,删除,修改,查找和排序 C语言 二分法查找 排序问题 《数据结构》习题集:第9章_查找 c语言 用数组,编写个程序完成对输入数据的排序,查找,添加,删除 c语言编程题目求教---输入员工姓名工号进行排序和查找 wps表格 查找排序问题? 数据结构C语言编程题 希尔排序排序和折半查找算法查找 excel,多个重复值,查找,排序问题 C语言的问题 排序及查找 excel查找并且排序问题 java 对象数组的排序查找问题 SQL查询并排序问题 数据结构的题:选取任一种排序方法之后进行折半查找 JAVA排序查找问题,回答后请私信我, 我电脑win7旗舰版网络连接上了但还是不能上网上网,信号上面有个黄色感叹号!