大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
既然是数组,表示数据为线性阵列了,想删除其中一个数据,是不可能的,只能用该位置以后的数据整体平移一个位置覆盖当前位置。例如:数组数据 1 2 3 4 5 6 7,想删除3,那么得到的新数组为1 2 4 5 6 7,其中 4 5 6 7 数据的位置相对原始数组位置整体平移减小1。
创新互联是专业的东光网站建设公司,东光接单;提供成都网站建设、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行东光网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
当然想是想快速删除数据,可以考虑使用数据链表,对数组单链即可
用两个指针,p,qp指向该结点的前驱,p指向该结点,然后 p-next=q-next;就删除成功了~~
char* remove_chars(char *str,const char *rmchars)//删除str中所有包含在rmchars中的字符
{
char buff[256]={0};
char *ps1,*ps2;
ps1=(char *)rmchars;
while(*ps1)
buff[*ps1++]=1;//遍历rmchars,将要删除的字符对应在buff中的位置1
ps2=str;
while(*ps2)//遍历str,将要删除的字符置为1
{
if(1==buff[*ps2])
*ps2=1;
ps2++;
}
ps1=str;
ps2=str;
while(0!=*ps1)//调整str中字符位置,删除所有置为1的位
{
if(1!=*ps1)
{
ps1++;
continue;
}
ps2=ps1+1;
while(0!=*ps2 1==*ps2)
ps2++;
if(0==*ps2)
break;
*ps1++=*ps2;
*ps2=1;
}
*ps1=0;
return str;
}
一楼的:
只能删除第一个字符,而且后面的写法是错误的。
二楼的:
没有释放内存,也是只能删除相同的一个字符。
void Insert_list(Sqlist L,int pos,ElemType e)//在POS处插入e
{
int i;
if(pos 1 || pos L.length+1)
printf("The num is out!");
L.elem = (ElemType *)realloc(L.elem,(++L.length)*sizeof(ElemType));
//问题很绕主要就出在length你刚开始就加了1
if(pos == L.length)
L.elem[L.length-1] = e;
else
{
i = L.length - 2;
while(i != pos - 2) {
L.elem[i+1] = L.elem[i];
i--;
}
L.elem[++i] = e;
}
}
如果修改如下,是不是更容易理解:
void Insert_list(Sqlist L,int pos,ElemType e)//在POS处插入e
{
int i;
if(pos 1 || pos L.length+1)
printf("The num is out!");
L.elem = (ElemType *)realloc(L.elem,(L.length + 1)*sizeof(ElemType));
if(pos == L.length + 1) //如果为之前的长度+1
L.elem[L.length] = e; //那么直接插在最后
else
{
i = L.length - 1; //否则从之前的最后一个元素开始遍历,也就是之前的长度-1的位置开始
while(i != pos - 2) { //找到pos-2的位置,其实是找pos-1的位置,即插入位置,但是为了移动元素,必须到pos-2,因为pos-1处的元素也需要向后移动,如果是到pos-1的话,那么pos-1处的元素将丢失
L.elem[i+1] = L.elem[i];
i--;
}
L.elem[++i] = e;//最终在pos-1处插入元素
}
L.length++;//最后再让长度加1
}
这样写似乎比较容易理解,先增加长度会使问题复杂化
测试前提:showList中iL.length而不是L.length+1
测试样例
int main()
{
Sqlist L;
Init_list(L);
Insert_list(L,1,1);
Insert_list(L,1,2);
Insert_list(L,2,3);
Insert_list(L,4,4);
Insert_list(L,3,5);
Show_list(L);
}
测试结果
2 3 5 1 4 ,没有问题
楼主的意思是在str1中删除str2中出现的字符?那么改成:
#includestdio.h
void main ()
{
char str1[9]={'t','i','n','m','f','g','y','f','s'};
char str2[3]={'A','s','g'};
int i,k,l;
for(i=0;i9;i++)
{
l=0;
for(k=0;k3;k++)
{
if (str1[i]=str2[k])
{l=1;break;}
}
if l!=1
printf("%c",str1[i]);
}
}
算法很多,告诉你一种比较好想的算法!自己编写,练习一下才有收获!
定义一个数组char a[10],输入一个字符串给它。再定义一个数组char b[10],把数组a中不是字符d和D的字符赋给数组b即可。很简单的!
//@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@
代码如下(已经编译运行过!)如下:
#include "stdio.h"
void main()
{
char a[10],b[10];
int i=0,j=0;
printf("输入字符串赋给数组a[10] :");
scanf("%s",a);
//把数组A一个个赋给数组B,判断一下,排除字符d和D,字符d和D的ASCII码值分别是100和68
for (i=0; i10; i++)
{
if (100 != a[i] 68 != a[i] ) //排除d和D字符
{
b[j] = a[i]; //把不是d和D的字符赋给数组b
j++;
}
}
printf("删除d和D字符后的字符串为 :%s\n",b);
}
//@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@