1. An exercise on lisk
• Write a definition of LIST_ENTRY, and the insertion and deletion operations
• Write a simple line editor
Keep the entire text on a linked list, one line in a separate node. Start the program with entering LINEEDIT file, after which a prompt appears along with the line number. If the letter “I” is entered with a number n following it, then insert the text to be followed before line n. If “I” is not followed by a number, then insert the text before the current line. If “D” is entered with two numbers n and m, one n, or no number following it, then delete lines n through m, line n, or the current line. Do the same with the command, “L”, which stands for listing lines. If “A” is entered, then append the text to the existing lines. Entry “E” signifies exit and saving the text in a file.
//这道题实在做不出,参考了别的同学的……
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("test.txt");
int cl=0;
//建立LIST_ENTRY类
class LIST_ENTRY
{
public:
struct node
{
public:
node *next;
string s0;
node(string s="")
{
s0=s;
next=NULL;
}
}*first;
int l;
LIST_ENTRY()
{
l=0;
first=NULL;
}
//A命令
int ins(string x,int y=cl+1)
{
int t=y-2;
node *p=first,*temp=new node(x);
if (t==-1)
{
temp->next=first;
first=temp;
l++;
cl++;
return 1;
}
if (p==NULL)
return 0;
while(t)
{
t--;
p=p->next;
if(p==NULL)
return 0;
}
temp->next=p->next;
p->next=temp;
if(y==cl+1)
cl++;
else
cl=y+1;
l++;
return 1;
}
//D命令
int del(int x)
{
node *p=first;
if (x==1)
{
if (first==NULL)return 0;
first=first->next;
l--;
delete p;
return 1;
}
if(p==NULL)
return 0;
while (x-2)
{
x--;
p=p->next;
if(p==NULL)
return 0;
}
node *temp=p->next;
if (temp!=NULL)
{
p->next=temp->next;
delete temp;
l--;
return 1;
}
return 0;
}
//E命令
int lis(int x,int y=0,node* p=NULL)
{
if (x==1)
p=first;
if (y==1&&x==1)
freopen("out.txt","w",stdout);
if (p==NULL)
return 0;
cl=x;
if (!y)
cout<<cl<<'>';
cout<<p->s0<<endl;
return lis(x+1,y,p->next);
}
}a;
int chg(char* c,string &s,int &x,int &y,string &s2)
{
int i,j;
s="",s2="";
x=y=cl;
if (c[1]!=' '||(c[0]!='I'&&c[0]!='D'&&c[0]!='A'))
{
for(i=0;c[i];i++)
s+=c[i];
return 0;
}
s+=c[0];
if (c[0]=='A')
{
for (i=2,j=0;c[i];i++)
{
if(c[i]!=' ')j=1;
if(j==1)s2+=c[i];
}
return 0;
}
for (i=2;c[i];i++)
if (c[i]!=' ')
{
for (j=0;c[i]!=' '&&c[i];i++)
j=j*10+c[i]-'0';
y=x=j;
break;
}
if (c[0]!='D')
return 0;
for (;c[i];i++)
if (c[i]!=' ')
{
for (j=0;c[i]!=' '&&c[i];i++)
j=j*10+c[i]-'0';
y=j;
break;
}
return 0;
}
int main()
{
string s,s2;
int x,y,i=0,j=0,k=0;
char c[1000];
while(fin.getline(c,1000,10))
{
for(i=0,s="";c[i];i++)
s+=c[i];
a.ins(s);
}
cout<<"LINEEDIT.txt"<<endl;
a.lis(1);
cout<<cl<<'>';
while(cin.getline(c,1000,10))
{
chg(c,s,i,j,s2);
if(s=="L")
{
k=0;
a.lis(1);
cout<<cl<<'>';
continue;
}
if(s=="A")
{
a.ins(s2);
cout<<cl<<'>';
continue;
}
if(s=="I")
{
k=2;
cl=i;
cout<<cl<<'>';
continue;
}
if(s=="E")
{
k=0;
a.lis(1,1);
return 0;
}
if(s=="D")
{
for(k=j;k>=i;k--)
a.del(k);
k=0;
cl=a.l;
cout<<cl<<'>';
continue;
}
if(k==2)
a.ins(s,cl);
cout<<cl<<'>';
}
system("pause");
return 0;
}
2. An exercise on queue
• Write a queue using a doubly linked list
• Simulate a command-dispatching system
– It can accept user‟s commands (from „a‟ – „j‟)
– These commands will take 1~10s, respectively
– The user commands will be enqueued if the program can not finish the previous commands
– The program will quit if user inputs command „q‟
• Hints:
– Use “_kbhit()” to determine whether user inputs a command
– Use “Sleep(1000)” to simulate the 1-second processing
• Add #include “Windows
posted on 2010-11-01 08:28
jyy 阅读(131)
评论(0) 编辑 收藏 引用 所属分类:
OJ平台