第1关:2.1-2.5顺序表
本关任务:编写一个顺序表。该顺序表的菜单如下(菜单选项用字母设定): C : 创建顺序表,格式为先输入‘C’再输入元素个数num,再输入对应的num个元素 G : 顺序表取值,格式为先输入‘G’再输入位置序号w,此菜单会输出取得的元素 L : 顺序表查找,格式为先输入‘L’再输入值e,此菜单会输出取得元素的位置 I : 顺序表插入,格式为先输入‘I’再输入插入位置序号w和插入的元素值 D : 顺序表删除,格式为先输入‘D’再输入位置序号w 你需要编写初始化、创建、取值、查找、插入、删除、输出7个函数。 其中元素ElemType e为1个平面坐标系下的点,拥有x和y两个坐标
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 1010
typedef int Status;
typedef struct
{
int x;
int y;
}ElemType;
typedef struct
{
/********************Begin***************************/
ElemType *elem;
int length;
/********************End*************************/
}SqList;
Status InitList(SqList &L)
{
/********************Begin***************************/
L.elem = new ElemType[MAXSIZE];
L.length = 0;
if(!L.elem) return ERROR;
return OK;
/********************End*************************/
}//InitList
Status CreateList(SqList &L, int num)
{
/********************Begin***************************/
int &k = L.length;
while(num -- )
{
cin >> L.elem[k].x >> L.elem[k].y;
k ++ ;
}
/********************End*************************/
}//CreateList
Status GetElem(SqList L, int w, ElemType &e)
{
/********************Begin***************************/
e = L.elem[w - 1];
/********************End*************************/
}//GetElem
int LocateElem(SqList L, ElemType e)
{
/********************Begin***************************/
for(int i = 0;i < L.length;i ++ )
if(L.elem[i].x == e.x && L.elem[i].y == e.y)
return i + 1;
/********************End*************************/
}//LocateElem
Status ListInsert(SqList &L, int w, ElemType e)
{
/********************Begin***************************/
w -- ;
if(w > L.length || w < 0) return ERROR;
for(int i = L.length; i > w ;i -- )
L.elem[i] = L.elem[i - 1];
L.elem[w] = e;
L.length ++ ;
/********************End*************************/
}//ListInsert
Status ListDelete(SqList &L, int w)
{
/********************Begin***************************/
for(int i = w - 1; i < L.length ;i ++ )
L.elem[i] = L.elem[i + 1];
L.length -- ;
/********************End*************************/
}//ListDelete
Status ListOut(SqList L)
{
for(int i = 0;i < L.length;i ++ )
cout << L.elem[i].x << ' ' << L.elem[i].y << endl;
}
int main()
{
SqList L;
InitList(L);
int n, w;
ElemType e;
cin >> n;
while(n --)
{
char op;
cin >> op;
switch(op)
{
case 'C':
int num;
cin >> num;
CreateList(L, num);
break;
case 'G':
cin >> w;
GetElem(L, w, e);
cout << e.x << ' ' << e.y << endl;
break;
case 'L':
cin >> e.x >> e.y;
cout << LocateElem(L, e) << endl;
break;
case 'I':
cin >> w;
cin >> e.x >> e.y;
ListInsert(L, w, e);
break;
case 'D':
cin >> w;
ListDelete(L, w);
break;
}
}
ListOut(L);
return 0;
}
第2关:2.6-2.12
本关任务:编写一个链表。该链表的菜单如下(菜单选项用字母设定): H : 头插创建链表,格式为先输入‘H’再输入元素个数num,再输入对应的num个元素 T: 尾插创建链表,格式为先输入‘T’再输入元素个数num,再输入对应的num个元素 G : 链表取值,格式为先输入‘G’再输入位置序号w,此菜单会输出取得的元素 L : 链表查找,格式为先输入‘L’再输入值e,此菜单会调用查找函数返回指针,进而再次输出e I : 链表插入,格式为先输入‘I’再输入插入位置序号w和插入的元素值e D : 链表删除,格式为先输入‘D’再输入位置序号w 你需要编写初始化、头插创建、尾插创建、取值、查找、插入、删除、输出8个函数。 其中元素ElemType e为1个平面坐标系下的点,拥有x和y两个坐标
//整体流程参照顺序表
#include <iostream>
#include <cstring>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 1010
typedef int Status;
typedef struct elem
{
int x,y;
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L)
{
/********************Begin***************************/
L = new LNode;
if(!L) return ERROR;
L -> next = NULL;
return OK;
/********************End*************************/
}//InitList
Status HeadcreateList(LinkList &L, int num)
{
/********************Begin***************************/
while(num -- )
{
LinkList t = new LNode;
t -> next = NULL;
cin >> t -> data.x >> t -> data.y;
t -> next = L -> next;
L -> next = t;
}
/********************End*************************/
}//CreateList
Status TailcreateList(LinkList &L, int num)
{
/********************Begin***************************/
LinkList p = L;
while(p -> next) p = p -> next;
while(num -- )
{
LinkList t = new LNode;
t -> next = NULL;
cin >> t -> data.x >> t -> data.y;
p -> next = t;
p = t;
}
/********************End*************************/
}//CreateList
Status GetElem(LinkList L, int w, ElemType &e)
{
/********************Begin***************************/
LinkList p = L;
int k = 0;
while(p && k < w)
{
p = p -> next;
k ++ ;
}
if(p && k == w) e = p -> data;
/********************End*************************/
}//GetElem
LinkList LocateElem(LinkList L,ElemType e)
{
/********************Begin***************************/
LinkList p = L -> next;
while(p)
{
if(p -> data.x == e.x && p -> data.y == e.y) return p;
p = p -> next;
}
return NULL;
/********************End*************************/
}//LocateElem
Status ListInsert(LinkList &L, int w, ElemType e)
{
/********************Begin***************************/
LinkList p = L;
int k = 0;
while(p && k < w - 1)
{
p = p -> next;
k ++ ;
}
if(p && k == w - 1)
{
LinkList t = new LNode;
t -> data = e;
t -> next = p -> next;
p -> next = t;
return OK;
}
return ERROR;
/********************End*************************/
}//ListInsert
Status ListDelete(LinkList &L, int w)
{
/********************Begin***************************/
LinkList p = L;
int k = 0;
while(p -> next && k < w - 1)
{
p = p -> next;
k ++ ;
}
if(!(p -> next) || k > w - 1) return ERROR;
LinkList t = p -> next;
p -> next = t -> next;
delete t;
return OK;
/********************End*************************/
}//ListDelete
Status ListOut(LinkList L)
{
LinkList p = L -> next;
while(p)
{
cout << p -> data.x << ' ' << p -> data.y << endl;
p = p -> next;
}
}
int main()
{
LinkList L,t;
InitList(L);
int n, w, num;
ElemType e;
cin >> n;
while(n --)
{
char op;
cin >> op;
switch(op)
{
case 'H':
cin >> num;
HeadcreateList(L, num);
break;
case 'T':
cin >> num;
TailcreateList(L, num);
break;
case 'G':
cin >> w;
GetElem(L, w, e);
cout << e.x << ' ' << e.y << endl;
break;
case 'L':
cin >> e.x >> e.y;
t = LocateElem(L,e);
cout << t -> data.x << ' ' << t -> data.y << endl;
break;
case 'I':
cin >> w;
cin >> e.x >> e.y;
ListInsert(L, w, e);
break;
case 'D':
cin >> w;
ListDelete(L, w);
break;
}
}
ListOut(L);
return 0;
}