链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。
下面给你基本的算法描述
图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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, * LinkList;
Status GetElem_L(LinkList& L, int i, ElemType& e) {
int m;
LinkList p;
p = L->next;
for (m=1; m < i && p; m++)
p = p->next;
if (!p || m > i)
return ERROR;
e = p->data;
return OK;
}
Status ListInsert_L(LinkList& L, int i, ElemType e) {
int m;
LinkList p,q;
p = L;
for (m = 1; m < i && p; m++)
p = p->next;
if (!p || m > i)
return ERROR;
q= (LinkList)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
Status ListDelete_L(LinkList& L, int i, ElemType& e) { // 算法2.10
int m;
LinkList p,q;
p = L;
for (m = 1; m < i && p->next; m++)
p = p->next;
if (!(p->next) || m > i)
return ERROR;
e = p->next->data;
q = p->next;
p->next = q->next;
free(q);
return OK;
}
void CreateList_L(LinkList& L, int n) {
LinkList p;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &(p->data));//%d
p->next = L->next;
L->next = p;
}
}
int ShowList_L(LinkList L) {
int m, n = 0;
LinkList p;
p = L->next;
if (!p)
return ERROR;
for (m = 0; p; m++)
{
printf("%d ", (p->data));
p = p->next;
n++;
}
return n;
}
int main() {
int n;
int m;
char strInst[30];
int a;
LinkList L;
int e;
scanf("%d", &n);
CreateList_L(L, n);
scanf("%d", &m);
while (m--) {
scanf("%s", strInst);
if (strcmp(strInst, "get") == 0) {
scanf("%d", &a);
if (GetElem_L(L, a, e) == OK) {
printf("%d\n", e);
}
else {
puts("get fail");
}
}
else if (strcmp(strInst, "insert") == 0) {
scanf("%d%d", &a, &e);
if (ListInsert_L(L, a, e) == OK) {
puts("insert OK");
}
else {
puts("insert fail");
}
}
else if (strcmp(strInst, "delete") == 0) {
scanf("%d", &a);
if (ListDelete_L(L, a, e) == OK) {
puts("delete OK");
}
else {
puts("delete fail");
}
}
else if (strcmp(strInst, "show") == 0) {
if (ShowList_L(L) == 0) {
puts("Link list is empty");
}
}
}
return 0;
}