链表的基本操作

题目:(答案正确,提交时间超时)

 

链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。

下面给你基本的算法描述:

图1:链表类型的定义以及获得链表元素的算法描述

图2:链表的插入算法描述

图3:链表的删除算法描述

图4:链表的创建算法描述

输入

输入数据只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。这一行整数是用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表中是1、2、3那么输入的顺序是3、2、1。

第二行有一个整数m,代表下面还有m行。每行有一个字符串,字符串是“get”,“insert”,“delete”,“show”中的一种。如果是“get”或者“delete”,则其后跟着一个整数a,代表获得或者删除第a个元素;如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e;“show”之后没有整数。

输出

如果获取成功,则输出该元素;如果删除成功则输出“delete OK”;如果获取失败或者删除失败,则输出“get fail”以及“delete fail”。如果插入成功则输出“insert OK”,否则输出“insert fail”。如果是“show”则输出列表中的所有元素,如果列表是空的,则输出“Link list is empty”。注:所有的双引号均不输出。

样例输入 Copy

3 3 2 1
21
show
delete 1
show
delete 2
show
delete 1
show
delete 2
insert 2 5
show
insert 1 5
show
insert 1 7
show
insert 2 5
show
insert 3 6
show
insert 1 8
show
get 2

样例输出 Copy

1 2 3
delete OK
2 3
delete OK
2
delete OK
Link list is empty
delete fail
insert fail
Link list is empty
insert OK
5
insert OK
7 5
insert OK
7 5 5
insert OK
7 5 6 5
insert OK
8 7 5 6 5
7

 

#include<iostream>
#include<cstdio>
using namespace std;

struct node
{//链表结点
	int data;
	node* next;
};

node* create(int array[], int n)
{
	node* p, * pre, * head;//pre保存当前结点的前驱结点,head为头结点
	head = new node;//创建头结点
	head->next = NULL;//头结点不需要数据域,指针域初始为NULL
	pre = head;//记录pre为head
	for (int i = n-1; i >=0; i--)
	{
		p = new node; //新建结点
		//将array[i]赋值给新建的结点作为数据域,也可以scanf输入
		p->data = array[i];
		p->next = NULL;//新节点的指针域设为NULL
		pre->next = p;//前驱结点的指针域设为当前新建结点的地址
		pre = p;//把pre设为p,作为下一个结点的前驱结点
	}
	return head;
}
//插入元素
void insert_list(node* head, int pos, int x)
{
	node* q1 = head->next;
	node* p = head;
	int i = 0;
	while (q1 != NULL)
	{
		i++;
		q1 = q1->next;
	}
	if (i < pos - 1)
	{
		cout << "insert fail" << endl;
	}
	else
	{
		for (int i = 0; i < pos - 1; i++)
		{
			p = p->next;//pos-1是为了到插入位置的前一个结点
		}
		node* q = new node;
		q->data = x;
		q->next = p->next;//新节点的下一个结点指向原先插入位置的结点,和下一步不可颠倒
		p->next = q;
		cout << "insert OK" << endl;
	}
	
}
//删除元素
void del(node* head, int pos)
{
	node* p1 = head->next;//p从第一个结点开始枚举
	node* pre = head;
	int i = 0;
	while (p1 != NULL)
	{
		i++;
		p1 = p1->next;
	}
	if (i < pos-1)
	{
		cout << "delete fail" << endl;
	}
	else
	{
		node* p = head->next;
		for (int i = 0; i < pos - 1; i++)
		{
			pre = p;
			p = p->next;
		}
		pre->next = p->next;
		delete(p);
		p = pre->next;
		cout << "delete OK" << endl;
	}
}
//输出链表中所有的元素
void show_list(node* head)
{
	node* p = head->next;
	if (p == NULL)
	{
		cout << "Link list is empty" << endl;
	}
	else
	{
		while (p != NULL)
		{
			cout << p->data << " ";
			p = p->next;
		}
		cout << endl;
	}
}
//输出第pos个元素
void get_list(node* head, int pos)
{
	node* p = head->next;
	int i = 0;
	while (p != NULL)
	{
		i++;
		p = p->next;
	}
	if (i < pos - 1)
	{
		cout << "get fail" << endl;
	}
	else
	{
		node* q = head->next;
		int i = 0;
		while (q != NULL)
		{
			i++;
			if (i == pos)
			{
				cout << q->data << endl;
				break;
			}
			else
			{
				q = q->next;
			}
		}
	}
}
int main()
{
	int n;
	int a[1000];
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	node* head = create(a, n);
	int N;
	string p;
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> p;
		if (p == "show")
		{
			show_list(head);
		}
		else if (p == "delete")
		{
			int m;
			cin >> m;
			del(head, m);
		}
		else if (p == "insert")
		{
			int m1, m2;
			cin >> m1 >> m2;
			insert_list(head, m1, m2);
		}
		else if (p == "get")
		{
			int m;
			cin >> m;
			get_list(head,m);
		}
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值