1. 程式人生 > >1326 Problem A 演算法2-8~2-11:連結串列的基本操作

1326 Problem A 演算法2-8~2-11:連結串列的基本操作

問題 A: 演算法2-8~2-11:連結串列的基本操作

時間限制: 1 Sec  記憶體限制: 32 MB
提交: 136  解決: 68
[提交][狀態][討論版][命題人:外部匯入]

題目描述

連結串列是資料結構中一種最基本的資料結構,它是用鏈式儲存結構實現的線性表。它較順序表而言在插入和刪除時不必移動其後的元素。現在給你一些整數,然後會頻繁地插入和刪除其中的某些元素,會在其中某些時候讓你查詢某個元素或者輸出當前連結串列中所有的元素。

下面給你基本的演算法描述:

圖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”。注:所有的雙引號均不輸出。

樣例輸入

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

樣例輸出

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

提示

提示:

1、因為輸入資料中含有大量的插入和刪除操作(不管你信不信,反正我信了),所以必須使用連結串列,否則很可能會超時。這也是考查連結串列的特性吧。

2、初始化連結串列的元素是倒序的,這個使用題目中建立列表的方法(從頭部插入)就可以了。

總結:

這題考查的是連結串列的特性。順序表中,怎樣判斷何時使用順序表何時使用連結串列呢?就要看它們的特點了。順序表的特點是隨機存取、隨機訪問,也就是說如果存取和查詢比較頻繁的話使用順序表比較合適;連結串列的特點是插入和刪除時不必移動其後的節點,如果插入和刪除操作比較頻繁的話使用連結串列比較合適。

#include<iostream>
#include<string>
using namespace std;
struct node {
	int data;
	node* next;
};

void create(node* &L, int n) {
	L = new node;
	L->next = NULL;
	for (int i = 0; i < n; i++) {
		node *p = new node;
		cin >> p->data;
		p->next = L->next;
		L->next = p;
	}
}

void get(node* head) {
	int x;
	cin >> x;
	node *p = head;
	for (int i = 0; i < x; i++) {
		p = p->next;
	}
	if (p == NULL) cout << "get fail" << endl;
	else cout << p->data << endl;
}

void insert(node* head) {
	int x, y;
	cin >> x >> y;
	node *p = head;
	for (int i = 0; i < x - 1; i++) {
		p = p->next;
		if (p == NULL) {
			cout << "insert fail" << endl;
			return;
		}
	}
	node *q = new node;
	q->data = y;
	q->next = p->next;
	p->next = q;
	cout << "insert OK" << endl;
}

void del(node* head) {
	int x;
	cin >> x;
	node *p = head;
	node *q = head->next;
	if (q == NULL) {
		cout << "delete fail" << endl;
		return;
	}
	for (int i = 0; i < x - 1; i++) {
		p = p->next;
		q = q->next;
	}
	p->next = q->next;
	cout << "delete OK" << endl;
}

void show(node* head) {
	node *p = head->next;
	if (p == NULL) {
		cout << "Link list is empty" << endl;
		return;
	}
	while (p->next != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << p->data << endl;
}

int main() {
	int n, m;
	while (cin >> n) {
		node *L;
		create(L, n);
		cin >> m;
		while (m--) {
			string s;
			cin >> s;
			if (s == "get") get(L);
			else if (s == "insert") insert(L);
			else if (s == "delete") del(L);
			else show(L);
		}
	}
	return 0;
}