现在头脑很乱,各位帮我理个思路吧。。。

hookilah 2005-08-19 08:18:24
例如:这组数据,是存放再一个链表里面的。
1,2, 4, 9, 10, 11, 12, 13, 16, 19, 20, 21, 23, 27
这住数据是按从大到小排列的(但是,组合的方法不一样)
也有可能是"1, 3, 5, 7, 8, 9, 12, 30“

先现在要把这组数据按照这样的格式输出1, 2, 4, 9-13, 16, 19, 20 ,21, 23, 27
也就是把3个以上连续的数按一个范围输出(比如例子里的9,10, 11, 12, 13输出为9-13)


现在搞的我乱死了。。。用了3个指针变来变去的,都把我变晕了。
弄了半天没一次成功的。

那位朋友可以给我理个思路, 不要代码,只要方法。。。。
...全文
193 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
SammyLan 2005-08-20
  • 打赏
  • 举报
回复
下面伪码,应该可以拿20分了吧 ^_^ ^_^
Cur=Head
CurNext=Cur;
while(Cur)
{
int iCount=0;
while(CurNext->next&&(CurNext->next->data==CurNext->data+1))
{
CurNext=CurNext->next;
++iCount;
}
if(iCuont>3)
cout<<Cur->data<<"-"<<CurNext->data<<",";
else
{
while(Cur!=CurNext->next)
{
cout<<Cur->data<<",";
Cur=Cur->next;
}
}
CurNext=Cur;
}
SammyLan 2005-08-20
  • 打赏
  • 举报
回复
不过稍微改一下就OK了
SammyLan 2005-08-20
  • 打赏
  • 举报
回复
不好意思
我没有看到要求三个以上的
llf_hust 2005-08-20
  • 打赏
  • 举报
回复
不对吧,要求要3个连续以上的才行
weaker 2005-08-20
  • 打赏
  • 举报
回复
伪码是什么啊
SammyLan 2005-08-19
  • 打赏
  • 举报
回复
Head是链表表头
至于next,data这些就不用我解释了吧

20分我全要了
楼主没有意见吧
^_^ ^_^
SammyLan 2005-08-19
  • 打赏
  • 举报
回复
楼上的太长了吧
看一下伪码,简单明了
Cur=Head
CurNext=Cur;
while(Cur)
{
while(CurNext->next->data==Cur->next->data+1)
CurNext=CurNext->next;
if(Cur==CurNext)
cout<<Cur->data<<",";
else
cout<<Cur->data<<"-"<<CurNext->data<<",";
Cur=CurNext->next;
CurNext=Cur;
}
llf_hust 2005-08-19
  • 打赏
  • 举报
回复
study
haozi112 2005-08-19
  • 打赏
  • 举报
回复
给段代码给你参考,时间关系,细节没有注意
#include <stdio.h>
#include <stdlib.h>
struct list
{
int data;
struct list *next;
};
int main( void )
{

struct list head , *p = NULL , *new = NULL ;
int key = 0;
int count = 0 , tmp = 0;
p = &head;
do
{
printf(" 请输入数据: ");
scanf( "%d" , &key );
if( key == -1 )
break;
new = ( struct list* ) malloc ( sizeof( struct list ) );
new->data = key;
new->next = NULL;
p->next = new;
p = p->next;

}while( 1 );

p = head.next;
tmp = head.next->data;

while( p != NULL )
{
while( p->next != NULL && tmp+1 == p->next->data )
{
count++;
tmp = p->next->data;
p = p->next;
}

if( count >= 2)
{
printf( "%d-%d\n" , p->data - count , p->data );
}

else if( count == 1)
{
printf( "%d\n%d\n" , p->data-1 , p->data );
}

else
{
printf("%d\n" , p->data );
}

if( p->next != NULL )
{
tmp = p->next->data;
}
count = 0;
p = p->next;

}
return 0;
}
SammyLan 2005-08-19
  • 打赏
  • 举报
回复
要是按照升序排列好了的话
这道题目就简单了
haozi112 2005-08-19
  • 打赏
  • 举报
回复
一个指针p, 一个计数器count,一个临时变量tmp初始化为第一个数据
p从链表的第2个开始遍历,用tmp++和p->data比较,如果相等,count++
else
{
if( count >=3 )
printf( "%d-%d" , p->data - count , p->data );
else
{
printf( "%d" , p->data );
count = 0;
}
}
充分考虑你数据连续递增的特点,自己把循环加入进去,只有一个指针,我想你不会再头晕了吧
xiaocai0001 2005-08-19
  • 打赏
  • 举报
回复
数~,用计数器,加两个指针,一个指向未输出的头,一个指向当前结点的前一个结点
若当前结点的值与前一结点的值连续,则第二个指针移动,计数器加一,当前指针移动到下一结点。否则,若计数器小于3,将第一个指针一个结点一个结点移动到第二个指针结点处并输出;大于等于3的话,只需要输出两个指针所指向结点的值。将当前计数器置1,两个指针都指向当前结点,当前结点指针后移。
注意遍历完后,有可能没有输出完,需要判断一下两个指针是否为空,不空时,需要数据输完
sunman1982 2005-08-19
  • 打赏
  • 举报
回复
哦,最重要得忘记说了,当计数器大于3得时候…… 后面得不用说了吧,自己实现一下看看※……
sunman1982 2005-08-19
  • 打赏
  • 举报
回复
一个计数器,2个指针,current&pre ,若current&pre数据相接(如 9。10)计数器加1,current=current-》link;否则,计数器置0,pre=current;current=current-》link;
hookilah 2005-08-19
  • 打赏
  • 举报
回复
这些数据的个数也不一定,没准只有一个。或者有几十个。。。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧