程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c++ 數據結構-字符串逆置問題,數據結構(C++)

c++ 數據結構-字符串逆置問題,數據結構(C++)

編輯:編程綜合問答
字符串逆置問題,數據結構(C++)

#include
#include
using namespace std;

typedef struct chunk
{
char ch;
struct chunk *next;
};
typedef struct LString
{
chunk *head,*tail;
int curlen;
};

//創建串的函數
string CreateString(LString &S)
{
cout<<"請輸入串:"< string s1;
S.head = new chunk;
chunk *tem_chunk;
tem_chunk = S.head;
tem_chunk->next = new chunk;
tem_chunk = tem_chunk->next;
getline(cin,s1);
for(int i = 0;i < s1.length();i++)
{
tem_chunk->ch = s1[i] ;
tem_chunk->next = new chunk;
tem_chunk = tem_chunk->next;
}
return s1;
}

//顯示串的函數
void ShowString(LString S,string s1)
{
chunk *tem = S.head;
for(int i = 0 ; i < s1.length() ; i++)
{

tem = tem->next;
cout<ch;
}

}

//匹配函數
int Index(string S,string T){
int i=0,j=0,n,m;
n=S.length();
m=T.length();
while(i<n&&j<m){
if(S[i]==T[j]){
i++;
j++;
}
else{
i=i-j+1;
j=0;
}
}
if(j==m)
{
cout<<"匹配成功"<<endl;
return i-m+1;
}
else
{
cout<<"匹配不成功"<<endl;
return 0;
}

}

//逆置函數
void Inverse(LString &S,LString T,int i,int k) //i為逆置起始點,k為子串長度
{
chunk *tem1 ,*tem2,*tem;
tem1 = S.head ;
//
for(int j = 0; j < i ;j++)
tem1 = tem1->next;
//
tem2 = tem1->next;
for(int j = 0; j< k*k ; j++)
{
tem = tem2->next ;
tem1->next = tem;
tem2->next = tem1;
tem1 = tem2;
tem2 = tem;
}

}
int main()
{
//完成匹配兩個串,並且找到首次匹配的子串並且逆置
LString S,T;
string s1,s2;
s1 = CreateString(S) ;
s2 = CreateString(T);
int n = Index(s1,s2);
if(n!=0)
{
Inverse(S,T,n,s2.length());
cout<<"逆置後字符串:";
ShowString(S,s1);
}
return 0;
}

一直抱錯,我調試了之後顯示就是在逆置函數那個地方出錯了
哪位好心的大神幫忙解答一下,字符串逆置我都搞暈了~~~

要求達到的效果是

S:ABCDEFGH T:CDEF
逆置後: S:ABFEDCGH

最佳回答:


//逆置函數
void Inverse(LString &S,LString T,int i,int k) //i為逆置起始點,k為子串長度
{
if(k==1)
return;

chunk *tem1 ,*tem2,*tem3;
chunk *begin , *end;
tem1 = S.head ;
//
for(int j = 0; j < i-1 ;j++)
    begin = tem1->next;
tem1 = begin->next;
tem2 = tem1->next;
if(k==2)
{
    begin->next = tem2;
    end = tem2->next;
    tem2->next = tem1;
    tem1->next = end;
}
else
{
    chunk *tem1_cpy = tem1;//記錄起始位置,最後要執行tem1_cpy->next = end
    tem3 = tem2->next;
    for(int i = 0; i<k-2; i++)
    {
        tem2->next =tem1;
        tem1 = tem2;
        tem2 = tem3;
        tem3 = tem3->next;
    }
    tem2->next = tem1;
    begin->next = tem2;
    tem1_cpy->next = tem3;
}

}
鏈表逆序

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved