题目:
| 链式表操作集 | 带头结点的链式表操作集 |
|---|---|
函数接口定义:
Position Find( List L, ElementType X );List Insert( List L, ElementType X, Position P );List Delete( List L, Position P );
其中List结构定义如下:```c typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List;
各个操作函数的定义为:<br />Position Find( List L, ElementType X ):返回线性表中首次出现X的位置。若找不到则返回ERROR;<br />List Insert( List L, ElementType X, Position P ):将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;<br />List Delete( List L, Position P ):将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。<br /><br /><br />[链接](https://pintia.cn/problem-sets/15/problems/728) | <a name="Jrio3"></a>### 函数接口定义:```cList MakeEmpty();Position Find( List L, ElementType X );bool Insert( List L, ElementType X, Position P );bool Delete( List L, Position P );
其中List结构定义如下:c
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 #include #define ERROR NULL typedef int ElementType; typedef struct LNode *PtrToNode; struct LNode { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; typedef PtrToNode Position; void Print(); 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”); } Print(L); 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 delete.\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”); tmp = Delete(L, P); if (tmp != ERROR) printf(“Wrong Answer\n”); for (P = L; P; P = P->Next) printf(“%d “, P->Data); return 0; } Position Find(List L, ElementType X) { Position tem = L; while (tem) { if (tem->Data == X) { return tem; } tem = tem->Next; } return ERROR; } List Insert(List L, ElementType X, Position P) { List tem = L; List current = (List)malloc(sizeof(struct LNode)); current->Data = X; if (L == P) //头指针 需要处理P为第一个节点的情况 { current->Next = P; L = current; return L; } else { while (tem) { if (tem->Next == P) { current->Next = P; tem->Next = current; return L; } tem = tem->Next; } printf(“Wrong Position for Insertion\n”); return ERROR; } } List Delete(List L, Position P) { List tem = L; if (L == P) //同样需要处理P为第一个节点的情况; { L = L->Next; return L; } else { while (tem->Next) { if (tem->Next == P) { tem->Next = P->Next; free(P); return L; } tem = tem->Next; } printf(“Wrong Position for Deletion\n”); return ERROR; } } void Print(List L) { List p = L; printf(“链表为:”); while (p) { printf(“%d “, p->Data); p = p->Next; } printf(“\n”); } |
#include #include #define ERROR NULL typedef int ElementType; typedef struct LNode *PtrToLNode; typedef enum { true, false } bool; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; typedef PtrToLNode Position; List MakeEmpty(); Position Find(List L, ElementType X); bool Insert(List L, ElementType X, Position P); bool Delete(List L, Position P); void Print(List L); 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”); } Print(L); 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 delete.\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; L = (List)malloc(sizeof(struct LNode)); L->Next = NULL; return L; } Position Find(List L, ElementType X) { List t = L->Next; while (t) { if (t->Data == X) { return t; } t = t->Next; } return ERROR; } bool Insert(List L, ElementType X, Position P) { List t = L; List current = (List)malloc(sizeof(struct LNode)); current->Data = X; while (t) { if (t->Next == P) { current->Next = P; t->Next = current; return true; } t = t->Next; } printf(“Wrong Position for Insertion\n”); return false; } bool Delete(List L, Position P) { List t = L; while (t) { if (t->Next == P) { t->Next = P->Next; free(P); return true; } t = t->Next; } printf(“Wrong Position for Deletion\n”); return false; } void Print(List L) { List t = L->Next; printf(“链表为: “); for (; t; t = t->Next) { printf(“%d “, t->Data); } printf(“\n”); } |
