august 发表于 2007-6-8 07:32:44

再来顺序表

#include<stdio.h>
struct list
{
    char list1;
    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);
}
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=p->list1;
      p->list1=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=p->list1;
      }
   
      p->size--;
    }
}
void display(struct list *p)         //显示数据
{
    int j;
    if(p->size==0)
      printf("顺序表为空.");
    else
    {
      printf("顺序表.");
      if(p->size==1)
            printf("%c",p->list1);
      else
      {
            for(j=0;j<p->size-1;j++)
                printf("%c-",p->list1);
            printf("%c",p->list1);
      }
      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给删除,应该如何修改正常删除最后一个字符呢?

duzhi5368 发表于 2007-6-8 16:53:36

出现这种原因是,p->size = 2时,      
       for(j=i-1;j<p->size-1;j++)
      {   
            p->list1=p->list1;
      }
       p->size--;
这句相当于for( j=1; j<1; j++ ){ ... }该循环内部没有正常执行.
所以,stack没有进行前移操作(p->list1=p->list1;这句没执行),
而后面的p->size--却执行了;
这就出现一个奇怪的现象,list1[]中明明有两个数据,而p->size却为1.
所以在最后那个display(&l);时,仅仅按照内部的
if(p->size==1)
            printf("%c",p->list1);
这句执行了,所以我们看到的是b,然而实际上p->list1[]中还是两个char数据,'a'和'b'都在,
所以,楼主您的问题有误,a并没有被删除.
这样一来,如何去修改的话,您自己可以参考,既然是del中的for循环错误.(适用性有限),再完善它就OK了.

Zelsazgh 发表于 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=p->list1;
      }
   
      p->size--;
    }
}
太强了.....在删除操作中,你要求把第二位的删除....接着...你这个函数把第二位的数据附充第一位上....

duzhi5368 发表于 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.
0x0012FEA061 62 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
0x0012FEB4cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
0x0012FEC8cc cc cc cc cc cc cc cc cc cc cc cc 02 00 00 00

另外你这个是个典型的STACK,为什么定义名list呢

duzhi5368 发表于 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");
.......

他是把指定位置之后的所有数据前移覆盖,然后删除尾数而已.欲删除的数据并没有任何操作

Zelsazgh 发表于 2007-6-8 17:09:47

Stack是FIFO.....他这个支持插入操作的说。。。。

Zelsazgh 发表于 2007-6-8 17:12:08

他MAIN里面要做的是什么,请先看清楚。。。。。del(&l,2);.....你知道他是覆盖操作。。。。这不是和他的目的不和吗?????

duzhi5368 发表于 2007-6-8 17:14:57

>_<我错了,是vector..

duzhi5368 发表于 2007-6-8 17:17:35

他没有覆盖成功.
而且,即使他覆盖成功,中间的 p->list1=p->list1; 执行了.
那也是将指定数据"后"的数据前移,并没有移动指定的数据本身.不会对指定数据之前的数据产生任何影响.

duzhi5368 发表于 2007-6-8 17:18:57

意思就是说
在del(&l,2);.....时
"太强了.....在删除操作中,你要求把第二位的删除....接着...你这个函数把第二位的数据附充第一位上...."
他永远不会将第第二位'b'覆盖第一位'a'.
页: [1] 2
查看完整版本: 再来顺序表