输入
为线性表的操作系列,每个操作一行,具体见样例。
输出
如果输入为"Empty", 则根据表是否为空输出"Empty"或 "Not empty"。
如果输入为"Length",则输出表长。
如果输入为"Insert i e",插入失败则输出"Insert failed",否则在i位置插入e后输出插入后表中的所有元素。
如果输入为"GetElem i ",参数i错误输出"Out of index",否则输出在i位置的元素。
如果输入为"LocateElem e",如果未发现输出"e is not found in list",否则输出e在表中的位置。
如果输入为"Delete i",如果失败输出"Delete failed",否则删除i位置的元素后输出插入后表中的所有元素。
具体参见样例。
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
typedef struct LNode
{
ElemType data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
Status InitList(LinkList &L)
{
/****在此下面完成代码***************/
L=NULL;
return OK;
/***********************************/
}
Status DestroyList(LinkList &L)
{
/****在此下面完成代码***************/
LinkList p;
while(L)
{
p=L->next;
delete L;
L=p;
}
return OK;
/***********************************/
}
int ListLength(LinkList L)
{
/****在此下面完成代码***************/
int i=0;
LinkList p=L;
while(p)
{
p=p->next;
i++;
}
return i;
/***********************************/
}
bool ListEmpty(LinkList L)
{
/****在此下面完成代码***************/
if(!L)return true;
else return false;
/***********************************/
}
Status GetElem(LinkList L, int i, ElemType &e) //链表的取值
{
/****在此下面完成代码***************/
int j=1;
LinkList p=L;
while(p&&j<i)
{
j++;
p=p->next;
}
if(!p||j>i)return ERROR;
e=p->data;
return OK;
/***********************************/
} //GetElem
int LocateElem(LinkList L, int e) //略有改动 按值查找
{
/****在此下面完成代码***************/
int j=1;
LinkList p=L;
while(p)
{
if(p->data==e)return j;
j++;
p=p->next;
}
if(!p)return ERROR;
/*************************************/
} //LocateElem
Status ListInsert(LinkList &L, int i, ElemType e) //单链表的插入
{
/****在此下面完成代码***************/
int j;
LinkList p=L,s,q;
if(i<1||(i>ListLength(L)+1))return ERROR;
//插入第一个元素
if(!L)
{
s=new LNode;
s->data=e;
s->next=NULL;
L=s;
p=L;
return OK;
}
//因为没有头结点,所以对第一个元素单独操作
if(i==1)
{
s=new LNode;
s->data=e;
s->next=L;
L=s;
return OK;
}else
{
for(j=1;j<i-1;j++)
{
//q=p;
p=p->next;
}
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
p=s;
return OK;
}
/***********************************/
} //ListInsert
Status ListDelete(LinkList &L, int i) // 链表的删除
{
/****在此下面完成代码***************/
int j;
LinkList p=L,s;
if(i<1||i>ListLength(L))return ERROR;
//对第一个元素单独操作
if(i==1)
{
L->next=p->next;
L=L->next;
}
else
{
for(j=1;j<i-1;j++)
{
p=p->next;
}
s=p->next;
p->next=s->next;
p=p->next;
delete s;
}
return OK;
/***********************************/
}
void ListPrint(LinkList L)
{
LNode *p;
for(p = L; p; p = p->next)
cout << p->data << (p->next ? ' ' : '\n');
}
int main()
{
int i;
ElemType e;
LinkList L;
string op;
InitList(L);
while(cin >> op) {
if(op == "Empty")
cout << (ListEmpty(L) ? "Empty" : "Not empty") << endl;
else if(op == "Insert") {
cin >> i >> e;
if(ListInsert(L, i, e) == ERROR)
cout << "Insert failed" << endl;
else
ListPrint(L);
} else if(op == "Length") {
cout << "List length is " << ListLength(L) << endl;
} else if(op == "GetElem") {
cin >> i;
if(GetElem(L, i, e) == ERROR)
cout << "Out of index" << endl;
else
cout << "The elem at position " << i << " is " << e << endl;
} else if(op == "LocateElem") {
cin >> e;
i = LocateElem(L, e);
if(i == 0)
cout << e << " is not found in list" << endl;
else
cout << e << " is found at the position " << i << endl;
} else if(op == "Delete") {
cin >> i;
if(ListDelete(L, i) == ERROR)
cout << "Delete failed" << endl;
else
ListPrint(L);
}
}
DestroyList(L);
return 0;
}
样例输入 Copy
Empty Insert 1 7 Empty Insert 2 3 Length Insert 1 -100 Length Insert 10 100 Length Insert 2 10000 Empty GetElem 2 GetElem 5 LocateElem 999 LocateElem 3 Delete 0 Delete 4 Delete 1 Length
样例输出 Copy
Empty 7 Not empty 7 3 List length is 2 -100 7 3 List length is 3 Insert failed List length is 3 -100 10000 7 3 Not empty The elem at position 2 is 10000 Out of index 999 is not found in list 3 is found at the position 4 Delete failed -100 10000 7 10000 7 List length is 2