幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3951|回复: 13

[通用编程] 再来顺序表

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-6-8 07:32:44 | 显示全部楼层 |阅读模式
#include<stdio.h>
struct list
{
    char list1[50];
    int size;
};
void setnull(struct list *p)   // 置空
{
    p->size=0;
}
char get(struct list *p,int i)
{
    if(i<1||i>p->size)
        printf("位置不正确\n");
    else
        return(p->list1[i-1]);
}
void insert(struct list *p,char x,int i)     //  插入数据
{
    int j;
    if(i<1||i>p->size+1)
        printf("位置不正确!\n");
    else
    {
        p->size++;
        for(j=p->size-1;j>i;j--)
            p->list1[j]=p->list1[j-1];
        p->list1[j]=x;
    }
}
void del(struct list *p,int i)           //   删除指定位置数据
{
    int j;
    if(i>p->size||i<1)
        printf("位置不正确!\n");
    else
    {
        
        for(j=i-1;j<p->size-1;j++)
        {
        
            
            p->list1[j]=p->list1[j+1];
        }
   
        p->size--;
    }
}
void display(struct list *p)           //  显示数据
{
    int j;
    if(p->size==0)
        printf("顺序表为空.");
    else
    {
        printf("顺序表.");
        if(p->size==1)
            printf("%c",p->list1[p->size]);
        else
        {
            for(j=0;j<p->size-1;j++)
                printf("%c-",p->list1[j]);
            printf("%c",p->list1[j]);
        }
        printf("\n");
    }
}
void main()
{
    struct list l;
    setnull(&l);
    insert(&l,'a',1);
    insert(&l,'b',2);
   
    display(&l);
    printf("位置 %d :%c\n",2,get(&l,2));
    del(&l,2);
    display(&l);
}

如果当只插入两个字符时,就不能正常删除,比如现在是 a-b :顺序表中的内容,如果按如下执行就会把a给删除,应该如何修改正常删除最后一个字符呢?
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-8 16:53:36 | 显示全部楼层
出现这种原因是,p->size = 2时,        
       for(j=i-1;j<p->size-1;j++)
        {   
            p->list1[j]=p->list1[j+1];
        }
       p->size--;
这句相当于for( j=1; j<1; j++ ){ ... }该循环内部没有正常执行.
所以,stack没有进行前移操作(p->list1[j]=p->list1[j+1];这句没执行),
而后面的p->size--却执行了;
这就出现一个奇怪的现象,list1[]中明明有两个数据,而p->size却为1.
所以在最后那个display(&l);时,仅仅按照内部的
if(p->size==1)
            printf("%c",p->list1[p->size]);
这句执行了,所以我们看到的是b,然而实际上p->list1[]中还是两个char数据,'a'和'b'都在,
所以,楼主您的问题有误,a并没有被删除.
这样一来,如何去修改的话,您自己可以参考,既然是del中的for循环错误.(适用性有限),再完善它就OK了.
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

20

主题

197

帖子

2641

积分

⑥精研

积分
2641
QQ
发表于 2007-6-8 16:54:36 | 显示全部楼层
void del(struct list *p,int i)          //  删除指定位置数据
{
    int j;
    if(i>p->size||i<1)
        printf("位置不正确!\\n");
    else
    {
      
        for(j=i-1;j<p->size-1;j++)
        {
      
           
            p->list1[j]=p->list1[j+1];
        }
   
        p->size--;
    }
}
太强了.....在删除操作中,你要求把第二位的删除....接着...你这个函数把第二位的数据附充第一位上....
签名要少于60,SO,i haven't upload my pic
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-8 17:02:22 | 显示全部楼层
这是循环快结束时候的内存分配,16进制的61转为10进制则是97,是'a'的ASC码,
16进制的62转为10进制则是98,是'b'的ASC码,其他地方为空,以'cc'填充,填充长度为50个
因为你分配了50个,两块被占用.应当是48块,但VC7.0为防止数组出界模糊问题,专门预留了
两位.之后的02就是p->size.不足四位,低位自动补0.
0x0012FEA0  61 62 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc  
0x0012FEB4  cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
0x0012FEC8  cc cc cc cc cc cc cc cc cc cc cc cc 02 00 00 00

另外你这个是个典型的STACK,为什么定义名list呢 [s:5]
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-8 17:07:33 | 显示全部楼层
引用第2楼Zelsazgh于2007-06-08 08:54发表的  :
void del(struct list *p,int i)          //  删除指定位置数据
{
    int j;
    if(i>p->size||i<1)
        printf("位置不正确!n");
.......

他是把指定位置之后的所有数据前移覆盖,然后删除尾数而已.欲删除的数据并没有任何操作[s:5]
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

20

主题

197

帖子

2641

积分

⑥精研

积分
2641
QQ
发表于 2007-6-8 17:09:47 | 显示全部楼层
Stack是FIFO.....他这个支持插入操作的说。。。。
签名要少于60,SO,i haven't upload my pic
回复 支持 反对

使用道具 举报

20

主题

197

帖子

2641

积分

⑥精研

积分
2641
QQ
发表于 2007-6-8 17:12:08 | 显示全部楼层
他MAIN里面要做的是什么,请先看清楚。。。。。del(&l,2);.....你知道他是覆盖操作。。。。这不是和他的目的不和吗?????
签名要少于60,SO,i haven't upload my pic
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-8 17:14:57 | 显示全部楼层
>_<我错了,是vector..
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-8 17:17:35 | 显示全部楼层
他没有覆盖成功.
而且,即使他覆盖成功,中间的 p->list1[j]=p->list1[j+1]; 执行了.
那也是将指定数据"后"的数据前移,并没有移动指定的数据本身.不会对指定数据之前的数据产生任何影响.
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

7

主题

190

帖子

1766

积分

⑥精研

....

积分
1766
发表于 2007-6-8 17:18:57 | 显示全部楼层
意思就是说
在del(&l,2);.....时
"太强了.....在删除操作中,你要求把第二位的删除....接着...你这个函数把第二位的数据附充第一位上...."
他永远不会将第第二位'b'覆盖第一位'a'.
萝卜啊,白菜啊,土豆星啊,梦想有爱啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-29 05:34 , Processed in 0.024562 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表