데이터 구조 Wangdao 대학원 학습서 연결 목록 연습 문제 --- 최소 노드를 삭제하는 효율적인 알고리즘

주제 설명:

헤드 노드가 있는 단일 연결 리스트 L에서 최소 노드를 삭제하는 효율적인 알고리즘을 작성해보십시오(최소 노드가 고유하다고 가정)

답에 대한 아이디어는 아주 명료한데 처음에는 예상하지 못했다.제가 생각한 아이디어는 다음과 같습니다(좀 더 똑바른, 답만큼 발전된 것은 아닙니다).

아이디어:

  1. 가장 먼저 기억해야 할 것은 단일 연결 목록 에서 요소를 삭제하거나 삽입 하려면 기록해야 한다는 것 被删除的元素的前驱结点입니다. 왜냐하면 후임 노드는 아무리 나빠도 선행 노드->다음->다음에서 얻을 수 있기 때문입니다. 이다. 따라서 전구체 노드는 필수입니다!
  2. 이 질문에서는 각 노드의 데이터 값을 지속적으로 비교한 다음 현재 가장 작은 노드의 선행자를 기록해야 합니다.
  3. 그래서 내 생각은 지속적으로 p->next를 비교하는 것입니다. 그러면 선행 노드는 p입니다.
  4. 그리고 q 포인터는 p(p를 가리킴)를 추적하는 데 사용해야 합니다. 왜냐하면 p->next는 지속적으로 비교되어야 하므로 p는 뒤로 이동해야 最小的那个节点的前驱하고 q 포인터가 현재 기록 할 때마다

특정 코드(실행 가능):

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
    
    
	int data;
	struct LNode *next;
}LNode,*LinkList;

LinkList Init(LinkList L){
    
    
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	LinkList r,s;
	r = L;
	printf("请输入元素:\n");
	scanf("%d",&x);
	while(x!= 999){
    
    
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		printf("请输入元素:\n");
		scanf("%d",&x);
	}
	r->next = NULL;
	return L;
} 

void print(LinkList L){
    
    
	LinkList p;
	p = L->next;
	while(p!= NULL) {
    
    
		printf("%5d",p->data);
		p = p->next;
	} 
	printf("\n"); 
}

void Del_min(LinkList L){
    
    
	LinkList p,q,r;
	int min;
	p = L;
	min = p->next->data;
	while(p->next != NULL){
    
    
		if(p->next->data <= min){
    
    
			min = p->next->data;
			q = p;
		}
			p = p->next;
	}
	r = q->next;
	q->next = r->next;
	free(r);
	print(L);
}



int main(){
    
    
	LinkList L,L1;
	L1 = Init(L);
	printf("打印初始链表:\n");
	print(L1);
	printf("打印删除最小值之后的链表:\n");
	Del_min(L1);
	return 0;
}

답을 작성하시오:

void Del_min(LinkList L){
	LinkList p,q,r;
	int min;
	p = L;
	min = p->next->data;
	while(p->next != NULL){
		if(p->next->data <= min){
			min = p->next->data;
			q = p;
		}
			p = p->next;
	}
	r = q->next;
	q->next = r->next;
	free(r);
}

추천

출처blog.csdn.net/weixin_47505105/article/details/123510440