//
# include & ltiostream.h & gt
# include & ltistream.h & gt
# include & ltfstream.h & gt
# include & ltstring.h & gt
# include & ltstdlib.h & gt
const long maxLen = 80
enum Error_code {success,overflow,underflow,range_error,failed}。
//////////////////////////////////////////////////////////////////////////
模板& lt類Node _ entry & gt
結構節點
{
//數據成員
Node_entry條目;
節點& ltNode _ entry & gt*下壹個;
//構造函數
node();
Node(Node_entry項,Node & ltNode _ entry & gt* link = NULL);
};
模板& lt類Node _ entry & gt
節點& ltNode _ entry & gt*節點()
{
next = NULL
}
模板& lt類Node _ entry & gt
節點& ltNode _ entry & gt* Node(Node _ entry項,Node & ltNode _ entry & gt*鏈接)
{
條目=項目;
下壹個=鏈接;
}
模板& ltclass List _ entry & gt
根據考試成績分等級排列的投考者的名單
{
公共:
~ List();
list();
List(const List & lt;List _ entry & gt& amp復制);
void運算符=(const List & lt;List _ entry & gt& amp復制);
錯誤代碼插入(long position,const List _ entry & ampx);
錯誤代碼清除();
Error_code remove(長位置);
錯誤代碼檢索(長位置,列表條目& amp項);
錯誤代碼替換(列表條目& ampx,多頭);
bool empty()常量;
long size()const;
void write();
受保護:
長計數;
節點& ltList _ entry & gt*頭;
節點& ltList _ entry & gt*set_position(多頭頭寸)const
私人:
};
模板& ltclass List _ entry & gt
列表& ltList _ entry & gt*清單()
{
count = 0;
head = NULL
}
模板& ltclass List _ entry & gt
列表& ltList _ entry & gt* List(const List & lt;List _ entry & gt& amp復制)
{
Node *new_copy,* copy _ node = copy.head
count = copy.count
if(copy _ node = = NULL)head = NULL;
其他
{
head = new _ copy = new Node & ltNode _ entry & gt(復制節點-& gt;詞條);
while(copy _ node-& gt;下壹個!=空)
{
復制節點=復制節點-& gt;接下來;
new _ copy-& gt;next =新節點& ltNode _ entry & gt(復制節點-& gt;詞條);
new _ copy = new _ copy-& gt;接下來;
}
}
}
模板& ltclass List _ entry & gt
列表& ltList _ entry & gt::~List()
{
而(!empty())
刪除(0);
}
模板& ltclass List _ entry & gt
無效列表& ltList _ entry & gt* operator =(const List & lt;List _ entry & gt& amp復制)
{
Node *new_head,*new_copy,* copy _ node = copy.head
count = copy.count
if(copy _ node = = NULL)new _ head = NULL;
其他
{
new_copy = new_head =新節點(copy _ Node-& gt;詞條);
while(copy _ node-& gt;下壹個!=空)
{
復制節點=復制節點-& gt;接下來;
new _ copy-& gt;next =新節點(copy _ Node-& gt;詞條);
new _ copy = new _ copy-& gt;接下來;
}
}
而(!empty())
刪除(0);
head = new _ head
}
模板& ltclass List _ entry & gt
錯誤代碼列表& ltList _ entry & gt*插入(多頭頭寸,常量列表_條目& ampx)
{
if(position & lt;0 ||位置& gt計數)
返回range _ error
節點& ltList _ entry & gt* new_node,*上壹個,*下壹個;
if(position & gt;0)
{
previous = set _ position(position-1);
following = previous->;接下來;
}
其他
以下=頭;
new_node =新節點& ltList _ entry & gt(x,以下);
if(新節點==空)
返回溢出;
if(position == 0)
head =新節點;
其他
上壹個-& gt;next = new _ node
count++;
返回成功;
}
模板& ltclass List _ entry & gt
節點& ltList _ entry & gt*列表& ltList _ entry & gt* set _ position(多頭頭寸)常量
{
節點& ltList _ entry & gt*p =頭;
for(int I = 0;我& lt位置;i ++)
p = p-& gt;接下來;
返回p;
}
模板& ltclass List _ entry & gt
錯誤代碼列表& ltList _ entry & gt*清除()
{
而(!empty())
刪除(0);
返回成功;
}
模板& ltclass List _ entry & gt
錯誤代碼列表& ltList _ entry & gt*移除(多頭頭寸)
{
if(position & lt;0 ||位置& gt=計數)
返回range _ error
節點& ltList _ entry & gt*p,*電流;
if(position == 0)
{
p =頭部;
head = head-& gt;接下來;
}
其他
{
當前= set _ position(position-1);
p =當前-& gt;接下來;
當前->;next = p-& gt;接下來;
}
刪除(p);
count-;
返回成功;
}
模板& ltclass List _ entry & gt
錯誤代碼列表& ltList _ entry & gt*替換(List _ entry & ampx,多頭)
{
節點& ltList _ entry & gt* current = NULL
if(position & lt;0 ||位置& gt=計數)
返回range _ error
current = set_position(位置);
當前->;entry = x;
返回成功;
}
模板& ltclass List _ entry & gt
錯誤代碼列表& ltList _ entry & gt*檢索(多頭頭寸,列表條目& amp項目)
{
節點& ltList _ entry & gt* current = NULL
if(position & lt;0 ||位置& gt=計數)
返回range _ error
current = set_position(位置);
item =當前-& gt;詞條;
返回成功;
}
模板& ltclass List _ entry & gt
長列表& ltList _ entry & gt*大小()常量
{
返回計數;
}
模板& ltclass List _ entry & gt
布爾列表& ltList _ entry & gt* empty()常量
{
return(count = = 0);
}
模板& ltclass List _ entry & gt
無效列表& ltList _ entry & gt*寫()
{
節點& ltList _ entry & gt*水流=水頭;
龍n;
for(n = 0;n & lt數數;n ++)
{
cout & lt& lt當前->;詞條;
電流=電流-& gt;接下來;
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
類別字符串
{
公共:
string();
~ String();
字符串(常量字符串& amp復制);
string(const char * copy);
字符串(列表& ltchar & gt& amp復制);
弦與弦。運算符=(常量字符串& amp復制);
const char * c _ str()const;
布爾運算符==(常量字符串& amp項);
布爾運算符& gt(常量字符串& amp項);
布爾運算符& lt(常量字符串& amp項);
布爾運算符& gt=(常量字符串& amp項);
布爾運算符& lt=(常量字符串& amp項);
布爾運算符!=(常量字符串& amp項);
牡蠣之友& amp操作員& lt& lt(ostream & ampstream,String obj);
受保護:
char *條目;
int長度;
私人:
};
void strcat(String & amp;add_to,const String & ampadd _ on);
字符串讀入(istream & ampiuput);
字符串讀入(istream & amp國際輸入輸出公司。終結者);
void strcpy(String & amp;復制,常量字符串和。原創);
void strncpy(字符串& amp復制,常量字符串和。original,int n);
長字符串(常量字符串& amp文本、常量字符串和。目標);
無效寫入(字符串& amps);
//////////////////////////////////////////////////////////////////////////
字符串::~字符串()
{
刪除[]個條目;
}
String::String()
{
entries = new char[maxLen+1];
如果(!條目)
{
cerr & lt& lt”分配錯誤\ n”;
退出(1);
}
長度= 0;
條目[0]= ' \ 0 ';
}
String::String(常量String & amp復制)
{
length = copy.length
條目=新字符[長度+1];
如果(!條目)
{
cerr & lt& lt”分配錯誤\ n”;
退出(1);
}
strcpy(entries,copy . entries);
}
String::String(const char *copy)
{
length = strlen(copy);
條目=新字符[長度+1];
strcpy(條目,副本);
}
String::String(List & lt;char & gt& ampin_list)
{
length = in _ list . size();
條目=新字符[長度+1];
for(int I = 0;我& lt長度;i ++)
in_list.retrieve(i,entries[I]);
條目[長度]= ' \ 0 ';
}
const char *String::c_str()常量
{
return (const char *)條目;
}
弦與弦。String::operator =(const String & amp;復制)
{
如果(& amp收到。=這個)
{
length = copy.length
刪除[]個條目;
條目=新字符[長度+1];
如果(!條目)
{
cerr & lt& lt”分配錯誤\ n”;
退出(1);
}
strcpy(entries,copy . entries);
}
其他
cout & lt& lt"試圖將字符串賦值給它自己!\ n ";
返回* this
}
bool String::operator==(常量字符串& amp項目)
{
return strcmp(c_str()、item . c _ str())= = 0;
}
bool String::運算符& lt(常量字符串& amp項目)
{
return strcmp(c_str()、item . c _ str())& lt;0;
}
bool String::operator & gt;(常量字符串& amp項目)
{
return strcmp(c_str()、item . c _ str())& gt;0;
}
bool String::operator & gt;=(常量字符串& amp項目)
{
return strcmp(c_str()、item . c _ str())& gt;= 0;
}
bool String::運算符& lt=(常量字符串& amp項目)
{
return strcmp(c_str()、item . c _ str())& lt;= 0;
}
bool String::運算符!=(常量字符串& amp項目)
{
返回strcmp(c_str(),item.c_str())!= 0;
}
牡蠣&;操作員& lt& lt(ostream & amp流,字符串對象)
{
write(obj);
回流;
}
void strcat(String & amp;add_to,const String & ampadd_on)
{
const char * c first = add _ to . c _ str();
const char * cs second = add _ on . c _ str();
char * copy = new char[strlen(cf first)+strlen(cs second)+1];
strcpy(copy,cf first);
strcat(copy,cs second);
add _ to = copy
刪除[]副本;
}
字符串讀入(istream & amp輸入)
{
列表& ltchar & gt溫度;
int size = 0;
char c;
while((c = input.peek())!EOF & amp& amp(c = input.get())!= '\n ')
temp . insert(size ++ c);
字符串答案(temp);
返回答案;
}
字符串讀入(istream & amp輸入,int & amp終結者)
{
列表& ltchar & gt溫度;
int size = 0;
char c;
while((c = input.peek())!EOF & amp& amp(c = input.get())!= '\n ')
temp . insert(size ++ c);
終結符= c;
字符串答案(temp);
返回答案;
}
void strcpy(String & amp;復制,常量字符串和。原文)
{
副本=原件;
}
void strncpy(字符串& amp復制,常量字符串和。原始,整數)
{
int I;
const char *ori = original.c_str()。
char * temp = new char[n+1];
for(I = 0;我& ltn;i ++)
{
temp[I]= ori[I];
}
temp[n]= ' \ 0 ';
string nori ginal(temp);
copy = noriginal
刪除[]temp;
}
void fail(long f[],const String & amp目標)
{
龍I,j;
const char * t = target . c _ str();
f[0]=-1;
for(j = 1;j & lt(長)strlen(t);j ++)
{
I = f[j-1];
while(*(t + j)!= *(t+I+1)& amp;& amp我& gt= 0)
I = f[I];
if(*(t + j) == *(t + i+1))
f[j]= I+1;
其他
f[j]=-1;
}
}
長字符串(常量字符串& amp文本、常量字符串和。目標)
{
const char * T = text . c _ str();
const char * P = target . c _ str();
long lenT = strlen(T),lenP = strlen(P),posT = 0,posP = 0;
if(lenP == 0 || lenT == 0)
{
cout & lt& lt"空目標或文本!"& lt& ltendl
return-1;
}
其他
{
long * f = new long[lenP];
失敗(f,目標);
while(posP & lt;倫普& amp& ampposT & lt四旬齋)
{
if(P[posP] == T[posT])
{
posp++;
posT ++的;
}
else if(posP == 0)
posT ++的;
else posP = f[posP-1]+1;
}
if(posP & lt;lenP)
{
刪除[]f;
return-1;
}
其他
{
刪除[]f;
借閱後歸還;
}
}
}
無效寫入(字符串& amps)
{
const char * display = s . c _ str();
if(顯示[0]!= '\0')
cout & lt& lt顯示& lt& ltendl
其他
cout & lt& lt“空弦!”& lt& ltendl
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
類編輯器:公共列表& lt字符串& gt
{
公共:
editor();
bool get _ command();
void run _ command();
受保護:
私人:
char user _ command
節點& lt字符串& gt*當前;
長線;
錯誤代碼next _ line();
錯誤代碼previous _ line();
錯誤代碼goto _ line();
錯誤代碼insert _ line();
Error_code change_line()。
void read _ file();
void write _ file();
void find _ string();
};
編輯器::編輯器()
{
current = NULL
line =-1;
}
錯誤代碼編輯器::next_line()
{
錯誤代碼結果=成功;
if(line & lt;計數- 1)
{
line++;
current = set _ position(line);
}
其他
結果=範圍_誤差;
返回結果;
}
錯誤代碼編輯器::previous_line()
{
錯誤代碼結果=成功;
if(line & gt;0)
{
行-;
current = set _ position(line);
}
其他
結果=範圍_誤差;
返回結果;
}
Error_code Editor::goto_line()
{
錯誤代碼結果=成功;
長偏移;
cout & lt& lt“妳想走哪條線?”& lt& lt同花順;
CIN & gt;& gt偏移;
if(offset & gt;= 0 & amp& ampoffset & lt計數)
{
line = offset
current = set _ position(line);
}
其他
結果=範圍_誤差;
返回結果;
}
void編輯器::find_string()
{
長指數;
cout & lt& lt輸入要搜索的字符串:“& lt& lt同花順;
string search _ string = read _ in(CIN);
while((index = strstrstr(current-& gt;entry,search_string)) == -1)
if(next_line()!=成功)突破;
if(index = =-1)cout & lt;& lt"找不到字符串。";
其他
{
cout & lt& lt(當前->;條目)。c _ str()& lt;& ltendl
for(long I = 0;我& lt指數;i ++)
cout & lt& lt" ";
for(無符號長整型j = 0;j & ltstrlen(search _ string . c _ str());j ++)
cout & lt& lt"^";
}
cout & lt& ltendl
}
錯誤代碼編輯器::change_line()
{
Error_code結果=成功;
cout & lt& lt"您想替換哪個文本段?"& lt& lt同花順;
string old _ text = read _ in(CIN);
cout & lt& lt"您想添加什麽新的文本段?"& lt& lt同花順;
string new _ text = read _ in(CIN);
long index = strstrstr(current-& gt;詞條,老_文);
if(index == -1)結果=失敗;
否則{
String new _ line
strncpy(new_line,current-& gt;詞條,索引);
strcat(new_line,new _ text);
const char * old _ line =(current-& gt;條目)。c _ str();
strcat(new_line,(String)(old _ line+index+strlen(old _ text . c _ str())));
當前->;entry = new _ line
}
返回結果;
}
錯誤代碼編輯器::insert_line()
{
錯誤代碼結果;
長line _ number
cout & lt& lt“插入什麽行號?”& lt& lt同花順;
CIN & gt;& gt行號;
while(cin.get()!= '\n ')
cout & lt& lt"要插入的新行是什麽?"& lt& lt同花順;
string to _ insert = read _ in(CIN);
outcome = insert(line_number,to _ insert);
line = line _ number
current = set _ position(line);
返回結果;
}
bool user_says_yes()
{
字符順序;
CIN & gt;& gt訂單;
return(order = = ' Y ' | | order = = ' Y ');
}
bool Editor::get_command()
{
如果(當前!=空)
cout & lt& ltline & lt& lt":"
& lt& lt當前->;entry . c _ str()& lt;& lt" \ n " & lt& lt同花順;
其他
cout & lt& lt“文件是空的。\ n " & lt& lt同花順;
CIN & gt;& gtuser _ command
user_command = tolower(用戶_命令);
while(cin.get()!= '\n ')
;
if(user_command == 'q ')
返回false
其他
返回true
}
void編輯器::run_command()
{
字符串temp _ string
開關(用戶命令)
{
案例“b”:
if(empty())
cout & lt& lt"警告:緩沖區為空" & lt& ltendl
其他
while(previous_line() ==成功)
;
打破;
案例“c”:
if(empty())
cout & lt& lt"警告:緩沖區為空" & lt& ltendl
else if(change_line()!=成功)
cout & lt& lt“錯誤:替換失敗”& lt& ltendl
打破;
案例“d”:
if(移除(count - 1)!=成功)
cout & lt& lt“錯誤:刪除失敗”& lt& ltendl
打破;
案例“e”:
if(empty())
cout & lt& lt"警告:緩沖區為空" & lt& ltendl
其他
while(next_line() ==成功)
;
打破;
案例“f”:
if(empty())
cout & lt& lt"警告:文件為空" & lt& ltendl
其他
find _ string();
打破;
案例“g”:
if(goto_line()!=成功)
cout & lt& lt"警告:沒有此行" & lt& ltendl
打破;
案子嗎?:
案例“h”:
cout & lt& lt"有效的命令是:b(egin)c(hange)d(El)e(nd)f(ind)g(o)h(elp)" & lt;& lt恩德爾
& lt& lt" I(nsert)l(ength)n(ext)p(rior)q(uit)w(rite)" & lt;& ltendl
打破;
案例“I”:
if(insert_line()!=成功)
cout & lt& lt“錯誤:插入失敗”& lt& ltendl
打破;
案例“l”:
cout & lt& lt“有”& lt& ltsize()& lt;& lt"文件中的行。"& lt& ltendl
如果(!empty())
cout & lt& lt"當前線路長度是"
& lt& ltstrlen((set _ position(count-1)-& gt;條目)。c _ str())& lt;& ltendl
打破;
案例“n”:
if(next_line()!=成功)
cout & lt& lt"警告:在緩沖區的末尾" & lt& ltendl
打破;
案例“p”:
if(previous_line()!=成功)
cout & lt& lt"警告:在緩沖區的開頭" & lt& ltendl
打破;
案例“w”:
if(empty())
cout & lt& lt"警告:文件為空" & lt& ltendl
其他
write();
打破;
默認值:
cout & lt& lt“按h還是?獲取幫助或輸入有效的命令:";
}
}
int main()
{
編輯器緩沖區;
cout & lt& lt"有效的命令是:b(egin)c(hange)d(El)e(nd)f(ind)g(o)h(elp)" & lt;& lt恩德爾
& lt& lt" I(nsert)l(ength)n(ext)p(rior)q(uit)w(rite)" & lt;& ltendl
while(buffer.get_command())
buffer . run _ command();
返回0;
}
我做的數據結構作業沒有文件功能。換壹個就好。