算法2.1-算法2.12顺序表和链表模拟

第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;
}

  • 17
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值