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

[通用编程] 再来顺序表

[复制链接]
发表于 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给删除,应该如何修改正常删除最后一个字符呢?
发表于 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了.
发表于 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--;
    }
}
太强了.....在删除操作中,你要求把第二位的删除....接着...你这个函数把第二位的数据附充第一位上....
发表于 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]
发表于 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]
发表于 2007-6-8 17:09:47 | 显示全部楼层
Stack是FIFO.....他这个支持插入操作的说。。。。
发表于 2007-6-8 17:12:08 | 显示全部楼层
他MAIN里面要做的是什么,请先看清楚。。。。。del(&l,2);.....你知道他是覆盖操作。。。。这不是和他的目的不和吗?????
发表于 2007-6-8 17:14:57 | 显示全部楼层
>_<我错了,是vector..
发表于 2007-6-8 17:17:35 | 显示全部楼层
他没有覆盖成功.
而且,即使他覆盖成功,中间的 p->list1[j]=p->list1[j+1]; 执行了.
那也是将指定数据"后"的数据前移,并没有移动指定的数据本身.不会对指定数据之前的数据产生任何影响.
发表于 2007-6-8 17:18:57 | 显示全部楼层
意思就是说
在del(&l,2);.....时
"太强了.....在删除操作中,你要求把第二位的删除....接着...你这个函数把第二位的数据附充第一位上...."
他永远不会将第第二位'b'覆盖第一位'a'.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-11-6 19:22 , Processed in 0.011159 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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