综述:
? ? ? ? 该题目链表是单向不带头不循环链表,需要实现3个接口,分别是插入、查找、删除三个基础操作,PTA的数据结构基础题感觉练手挺好的。
目录
综述:
题目:
函数接口定义:?
裁判测试程序样例:
输入样例:?
输出样例:?
?函数接口1-查找元素:
查找代码:
函数接口2-插入节点:?
插入代码:
函数接口3-删除节点:?
删除代码:
总结:
题目:
本题要求实现链式表的操作集。
函数接口定义:?
Position Find( List L, ElementType X ); List Insert( List L, ElementType X, Position P ); List Delete( List L, Position P );
其中List 结构定义如下:
typedef struct LNode *PtrToLNode; struct LNode { ? ? ElementType Data; ? ? PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List;?
各个操作函数的定义为:
?Position Find( List L, ElementType X ) :返回线性表中首次出现X的位置。若找不到则返回ERROR;
List Insert( List L, ElementType X, Position P ) :将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
?List Delete( List L, Position P ) :将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define ERROR NULL
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );
int main()
{
List L;
ElementType X;
Position P, tmp;
int N;
L = NULL;
scanf("%d", &N);
while ( N-- ) {
scanf("%d", &X);
L = Insert(L, X, L);
if ( L==ERROR ) printf("Wrong Answer\n");
}
scanf("%d", &N);
while ( N-- ) {
scanf("%d", &X);
P = Find(L, X);
if ( P == ERROR )
printf("Finding Error: %d is not in.\n", X);
else {
L = Delete(L, P);
printf("%d is found and deleted.\n", X);
if ( L==ERROR )
printf("Wrong Answer or Empty List.\n");
}
}
L = Insert(L, X, NULL);
if ( L==ERROR ) printf("Wrong Answer\n");
else
printf("%d is inserted as the last element.\n", X);
P = (Position)malloc(sizeof(struct LNode));
tmp = Insert(L, X, P);
if ( tmp!=ERROR ) printf("Wrong Answer\n");
tmp = Delete(L, P);
if ( tmp!=ERROR ) printf("Wrong Answer\n");
for ( P=L; P; P = P->Next ) printf("%d ", P->Data);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:?
6 12 2 4 87 10 2 4 2 12 87 5
输出样例:?
2 is found and deleted. 12 is found and deleted. 87 is found and deleted. Finding Error: 5 is not in. 5 is inserted as the last element. Wrong Position for Insertion Wrong Position for Deletion 10 4 2 5?
?函数接口1-查找元素:
? ? ? ? 查找元素在链表操作中是最简单的一个接口,从链表的开始L开始遍历,如果找到就返回位置,如果找不到就一直找它的Next,一直到Next指向为空说明这个链表结束,如果Next指向空,该函数也没返回,说明查找的元素不在该链表中。
? ? ? ? 我们可以用一个cur指针遍历这个链表,大致流程如上图所示,具体代码如下:
查找代码:
Position Find(List L, ElementType X)
{
List cur = L;
while (cur)
{
if (cur->Data == X)
{
return cur;
}
cur = cur->Next;
}
return ERROR;
}
函数接口2-插入节点:?
????????
?
插入代码:
List Insert(List L, ElementType X, Position P)
{
if (L == P)
{
List newnode = (List)malloc(sizeof(struct LNode));
newnode->Data = X;
newnode->Next = L;
return newnode;
}
else
{
List cur = L;
while (cur)
{
if (cur->Next == P)
{
List newnode = (List)malloc(sizeof(struct LNode));
newnode->Next = P;
cur->Next = newnode;
newnode->Data = X;
return L;
}
cur = cur->Next;
}
printf("Wrong Position for Insertion\n");
return ERROR;
}
}
函数接口3-删除节点:?
? ? ? ? 删除节点首先要判断一下要删除的节点为空还是不为空,如果是空节点直接返回值,如果节点不为空再进行判断删除。如果只有一个节点,直接返回一个空指针也OK,最好还是要把那一个节点free掉比较好,如果是头删,则free掉L返回L->Next,其他正常情况的删除逻辑如下图:
删除代码:
List Delete(List L, Position P)
{
if (L == NULL)
{
printf("Wrong Position for Deletion\n");
return ERROR;
}
else if (P == L)
{
if (P->Next == NULL)
{
return NULL;
}
else
{
List tmp = P->Next;
free(P);
P = NULL;
return tmp;
}
}
else
{
List cur = L;
while (cur)
{
if (cur->Next == P)
{
List tmp = P->Next;
free(P);
P = NULL;
cur->Next = tmp;
return L;
}
cur = cur->Next;
}
printf("Wrong Position for Deletion\n");
return ERROR;
}
}
总结:
? ? ? ? 单链表无头不循环链表自我感觉比顺序表好写,整个题都是基础的增删查改相关,适合看完课巩固知识练手用。
|