6-5 链式表操作集 (20 分)

这篇博客讲述了在C语言中如何实现链表的基本操作,包括初始化、插入元素、删除元素以及查找元素。博主在实现过程中遇到了头指针未分配内存的问题,通过修改代码解决了这一问题。此外,还讨论了插入和删除操作的注意事项,并提供了完整的测试代码,包括插入错误位置和删除错误位置的处理。最后,博主对链表进行了释放内存的操作。
摘要由CSDN通过智能技术生成

题目描述:

其中List结构定义如下:

typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

各个操作函数的定义为:

输入样例:

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.在最开始的Insert函数中,裁判测试给出的L作为头指针,是这样定义的:

List L;

L=NULL;//L是一个指向结构体的指针,但是与往常做题不同的是,L暂时没有分Data,Next域,所以当L=L->Next语句出现时,就是错误,程序会停止运行

(若想应用L=L->Next,就要用malloc语句先分配空间)

这是我最初写的代码:

 我按以前的习惯,以为头指针是用malloc分配过的,然后就出错了。

其他有关插入和删除的链表操作,只要注意第一个元素特殊讨论就行

完整代码:(裁判测试样例这有些不足,就是没有free链表,我自己加在后面了)

#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);
	List k = L;
	while (k != NULL) {
		k = k->Next;
		free(L);
        L=k;
	}
	return 0;
}

List Insert( List L, ElementType X, Position P ) {
	List head = L;
	List node;
	node = (List)malloc(sizeof(struct LNode));
	node->Data = X;
	node->Next = NULL;
	if (P == L) {
		node->Next = L;
		return node;
	}
	while (L != NULL) {
		if (P == L->Next) {
			node->Next = L->Next;
			L->Next = node;
			return head;
		}
		L = L->Next;
	}
	printf("Wrong Position for Insertion\n");
	return ERROR;
}

Position Find( List L, ElementType X ) {
	List p;
	p = L;
	while (p != NULL) {
		if (p->Data == X)
			return p;
		else
			p = p->Next;
	}
	return ERROR;
}

List Delete( List L, Position P ) {
	if (P == L) {
		return L->Next;
	} else {
		List p, q;
		q = L;
		p = L->Next;
		while (p != NULL) {
			if (p == P) {
				q->Next = p->Next;
				free(p);
				return L;
			} else {
				q = p;
				p = p->Next;
			}
		}
	}
	printf("Wrong Position for Deletion\n");
	return ERROR;
}

 有错误的话欢迎指正!!^-^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想写好代码的小猫头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值