既然是數組,表示數據為線性陣列了,想刪除其中一個數據,是不可能的,只能用該位置以后的數據整體平移一個位置覆蓋當前位置。例如:數組數據 1 2 3 4 5 6 7,想刪除3,那么得到的新數組為1 2 4 5 6 7,其中 4 5 6 7 數據的位置相對原始數組位置整體平移減小1。
創(chuàng)新互聯(lián)是專業(yè)的東光網站建設公司,東光接單;提供成都網站建設、網站制作,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行東光網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!
當然想是想快速刪除數據,可以考慮使用數據鏈表,對數組單鏈即可
用兩個指針,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中出現(xiàn)的字符?那么改成:
#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即可。很簡單的!
//@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@
代碼如下(已經編譯運行過?。┤缦拢?/p>
#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);
}
//@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@