双指针实现;
/*
TODO: 删除表中与Item值相同的元素
功能:从键盘输入一个整数item,删除表中与Item数字相同的元素
比如:表为:6 5 4 3 2 1,录入2,则删除2,新的顺序表为:6 5 4 3 1
参数:List *L 是需要操作的表,item是指定删除元素的数值
返回值:空
*/
typedef struct Sq {
int elem[MAX] ;
int length ; //长度;
} List;
void Delete(List *L , int item){
int *p1,*p2;
int i=L->length;
p1= &L->elem[0], p2=&L->elem[L->length];
//统计顺序表中为item的总共个数;
while(i!=-1)
{
if(L->elem[i]==item)
{
L->length--;
}
i--;
}
while(1)
{
if( *p1==item )
{
while(*p2==item)//当遇到 *p1==item && *p2==item 移动*p2 ;
{
p2++;
}
*p1=*p2 ;
if(p1+sizeof(int)==p2) //相遇时;
{
break;
}
p2++;
p1++;
}
else
p1++;
}
}
当输入遇到 0 +回车时输入结束;
为什么 无法达到 删除相同的item ? 而且输出中总是有未知的值 ?
希望帮忙解答一下;
输出示例;
p2=&L->elem[L->length]
内存访问越界了,最后一个数是L->elem[L->length-1]
p2++;
多次越界int *p1,*p2
,指针是int型,数组也是int型,p1 + 1就是访问下一个元素了,p1+sizeof(int)
等于p1+4
,所以用p1+sizeof(int)==p2)
去判断相遇是不对的追加内容
你的思路可以解题,只是把问题复杂化了。
我有个简洁的思路你参考一下
输出