4-6 带头结点的链式表操作集
2016-06-26 17:30
351 查看
本题要求实现带头结点的链式表操作集。
函数接口定义:
List MakeEmpty();
Position Find( List L, ElementType X );
bool Insert( List L, ElementType X, Position P );
bool Delete( List L, Position P );
其中List结构定义如下:
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
各个操作函数的定义为:
List MakeEmpty():创建并返回一个空的线性表;
Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P ):将X插入在位置P指向的结点之前,返回true。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回false;
bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回false。
裁判测试程序样例:
输入样例:
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
题目链接:
https://pta.patest.cn/pta/test/15/exam/3/question/729
函数接口定义:
List MakeEmpty();
Position Find( List L, ElementType X );
bool Insert( List L, ElementType X, Position P );
bool Delete( List L, Position P );
其中List结构定义如下:
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
各个操作函数的定义为:
List MakeEmpty():创建并返回一个空的线性表;
Position Find( List L, ElementType X ):返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P ):将X插入在位置P指向的结点之前,返回true。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回false;
bool Delete( List L, Position P ):将位置P的元素删除并返回true。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回false。
裁判测试程序样例:
#include <stdio.h> #include <stdlib.h> #define ERROR NULL typedef enum {false, true} bool; typedef int ElementType; typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List; List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); int main() { List L; ElementType X; Position P; int N; bool flag; L = MakeEmpty(); scanf("%d", &N); while ( N-- ) { scanf("%d", &X); flag = Insert(L, X, L->Next); if ( flag==false ) 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 { flag = Delete(L, P); printf("%d is found and deleted.\n", X); if ( flag==false ) printf("Wrong Answer.\n"); } } flag = Insert(L, X, NULL); if ( flag==false ) printf("Wrong Answer\n"); else printf("%d is inserted as the last element.\n", X); P = (Position)malloc(sizeof(struct LNode)); flag = Insert(L, X, P); if ( flag==true ) printf("Wrong Answer\n"); flag = Delete(L, P); if ( flag==true ) printf("Wrong Answer\n"); for ( P=L->Next; 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
#include <stdio.h> #include <stdlib.h> #define ERROR NULL typedef enum {false, true} bool; typedef int ElementType; typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List; List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); int main() { List L; ElementType X; Position P; int N; bool flag; L = MakeEmpty(); scanf("%d", &N); while ( N-- ) { scanf("%d", &X); flag = Insert(L, X, L->Next); if ( flag==false ) 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 { flag = Delete(L, P); printf("%d is found and deleted.\n", X); if ( flag==false ) printf("Wrong Answer.\n"); } } flag = Insert(L, X, NULL); if ( flag==false ) printf("Wrong Answer\n"); else printf("%d is inserted as the last element.\n", X); P = (Position)malloc(sizeof(struct LNode)); flag = Insert(L, X, P); if ( flag==true ) printf("Wrong Answer\n"); flag = Delete(L, P); if ( flag==true ) printf("Wrong Answer\n"); for ( P=L->Next; P; P = P->Next ) printf("%d ", P->Data); return 0; } List MakeEmpty(){ List l=(List) malloc((sizeof(struct LNode))); l->Next=NULL; return l; } Position Find( List L, ElementType X ){ Position temp; while(L->Next!=NULL){ temp=L->Next; //temp保存第一个节点 if(temp->Data==X) return temp; L=L->Next; } return ERROR; } bool Insert( List L, ElementType X, Position P ){ List apply = NULL; //待插入的新节点 while(L->Next != P && L->Next != NULL)//若没找到P并且没到链尾则往下移动 L = L->Next; if(L->Next == NULL&&P!=NULL){//如果已经到了链尾,说明P肯定不在链表里,而此时P又不为NULL,则一定是P出现了错误 printf("Wrong Position for Insertion\n"); return false; } else //有三种情况:第一种L->Next!=NULL,P!=NULL是普通情况 { //第二种L->Next!=NULL,P==NULL 这种情况不存在, //因为若P==NULL,则退出while循环后L->Next或者走到L->Next=NULL或者L->Next=P仍为NULL,所以此种情况不存在。 //第三种L->Next==NULL,P==NULL 则插在链表末尾 apply = (List) malloc((sizeof(struct LNode))); apply->Data = X; L->Next = apply; apply->Next = P; return true; } } bool Delete( List L, Position P ){ if(L->Next== NULL||P==NULL){ //如果只有头结点或者删除的位置是NULL,则不能删除 printf("Wrong Position for Deletion\n"); return false; } while(L->Next != P && L->Next != NULL) L = L ->Next; if(L->Next == NULL){ //P一定在链表上,如果始终没有找到P,则删除错误 printf("Wrong Position for Deletion\n"); return false; } else{ //否则删除P L->Next = P->Next; free(P); return true; } }
题目链接:
https://pta.patest.cn/pta/test/15/exam/3/question/729
相关文章推荐
- 下一个较大排列组合
- 与你相遇,好幸运
- 为什么构造函数不能是虚函数
- 跟着SY速学Ubuntu系列七:Composer学习(3):超简单的实现ORM框架的依赖加载
- 对于ArrayList中的泛型进行分析
- 08、css框架与表格
- Unison(rpm方式)安装及应用--nginx高可用
- 【DAY1】hadoop的安装配置基础学习笔记
- 来自 Fedora 24 工作站版的四大改进
- 通过反射获取类的类名,方法和内部成员变量
- 230. Kth Smallest Element in a BST
- 141.Valid Perfect Square
- html标签简单总结
- adb工具如何连接手机安装apk
- 模板类中可以使用虚函数吗?模板成员函数可以是虚函数吗?
- shell下的sed命令
- adb工具如何连接手机安装apk
- 《深入理解JVM》读书笔记
- The Direct3D 11 Graphics Pipeline
- heap and heap sort