4-6 带头结点的链式表操作集 (20分)
2016-11-10 22:37
399 查看
本题要求实现带头结点的链式表操作集。 函数接口定义: 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; } /* 自己写的,已测试通过; 犯了两个错误: 1、一般情况下都要设置一个新的指针变量来保存函数传入的链表指针,然后拿这个新设的变量去操作,这些好的习惯;防止出错 修改了原指针; 2、是while(p),自己写成了while(p->next);看清循环体内最后结果是返回p; 3、老师的答案写的更简洁,可以参考下 Position Find( List L, ElementType X ) { Position p = L; if(p == NULL) return ERROR; while(p){ if(p->Data == X){ return p; } else{ p = p->Next; } } return ERROR; } */ Position Find( List L, ElementType X ) { Position p = L; /* p指向L的第1个结点 */ while ( p && p->Data!=X ) p = p->Next; /* 下列语句可以用 return p; 替换 */ if ( p ) return p; else return ERROR; } /* 带头结点的插入 */ bool Insert( List L, ElementType X, Position P ) { /* 这里默认L有头结点 */ Position temp, pre; /* 查找P的前一个结点,这里最开始没想到for循环不需要写循环体内程序就可以了 */ for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ; if ( pre==NULL ) { /* P所指的结点不在L中 */ printf("Wrong Position for Insertion\n"); return false; } else { /* 找到了P的前一个结点pre */ /* 在P前插入新结点 */ temp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */ temp->Data = X; temp->Next = P; pre->Next = temp; //刚开始忘记写return true; return true; } } /* 带头结点的删除 */ bool Delete( List L, Position P ) { /* 这里默认L有头结点 */ Position pre; /* 查找P的前一个结点 */ for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ; if ( pre==NULL || P==NULL) { /* P所指的结点不在L中 */ printf("Wrong Position for Deletion\n"); return false; } else { /* 找到了P的前一个结点pre */ /* 将P位置的结点删除 */ pre->Next = P->Next; free(P); return true; } }
相关文章推荐
- PTA数据结构与算法题目集(中文)4-6 带头结点的链式表操作集 (20分)
- 带头结点的链式表操作集
- 6-6 带头结点的链式表操作集(20 point(s))
- 4-6 带头结点的链式表操作集
- 带头结点的链式表操作集
- 4-6 带头结点的链式表操作集
- 带头结点的链式表操作集
- 带头结点的链式表操作集(浙大数据结构)
- 带头结点的单向链表
- 带头结点的单链表——数据结构课堂作业
- 不带头结点的单链表的常规操作
- 对于带头结点的单链表的相关操作
- C实现头插法和尾插法来构建单链表(不带头结点)
- 带头结点的单链表类C++手动实现
- 带头结点的单链表总结
- 约瑟夫环问题(不带头结点单循环链表实现和数组实现)
- 不带头结点的链表操作及其逆置
- 单链表的建立、求长、插入、删除、输出和释放 (带头结点)
- C++实现带头结点的单链表(友元类)
- 单链表、带头结点的单链表、循环单链表 以及其操作实现