Pagina inicial:
Colunas de tópico:
Estrutura de dados_Ainda existem blogs desconhecidos esperando para serem explorados-CSDN Blog
Índice
Definição de interface de função:
Exemplo de procedimento de teste de árbitro:
I. Introdução
Ao aprender estrutura de dados pela primeira vez, certifique-se de escrever os exemplos mais básicos e simples com muita habilidade. Cada vez que você escrevê-los, você aumentará sua compreensão de sua estrutura e estabelecerá uma base sólida para o conhecimento mais difícil no futuro. ! Você não deve copiar cegamente o código de outras pessoas. No final, você mesmo deve escrevê-lo!
2. Título
Esta questão requer a implementação de uma função para reverter uma determinada lista vinculada individualmente.
Definição de interface de função:
List Reverse( List L );
A
List
estrutura é definida da seguinte forma:typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */
L
Dada uma lista vinculada individualmente, a funçãoReverse
deve retornar a lista vinculada invertida.Exemplo de procedimento de teste de árbitro:
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表 */ List Reverse( List L ); int main() { List L1, L2; L1 = Read(); L2 = Reverse(L1); Print(L1); Print(L2); return 0; } /* 你的代码将被嵌在这里 */
5 1 3 4 5 2
Amostra de saída:
1 2 5 4 3 1
Limite de comprimento de código
16KB
limite de tempo
400ms
limite de memória
64MB
3. Compreensão + Código
1. Entenda
Ao ver esta pergunta, você pode de repente se sentir muito familiarizado, como se fosse muito semelhante à inversão de cordas que você aprendeu antes.
Existem muitas ideias para reversão de strings :
1. Não recursivo: basta usar duas variáveis, uma variável à esquerda aponta para o primeiro caractere da string e a outra variável à direita aponta para o último caractere da string e, em seguida, troque-as para determinar o sinal final. (O código chave é o seguinte)
while(left<right) { //交换 }
2. Recursão, realizando ordem inversa de acordo com as características da recursão
#include<stdio.h> int my_strlen(char* arr) { if (*arr != '\0') return 1 + my_strlen(arr + 1); else return 0; } char* rev(char* arr) { char tmp = *arr; int len = my_strlen(arr); *arr = *(arr + len - 1); *(arr + len - 1) = '\0'; if (my_strlen(arr+1) >=2) rev(arr + 1); *(arr + len - 1) = tmp; } int main() { char arr[] = "abcdef"; rev(arr); printf("%s", arr); return 0; }
Pergunta: Falando nisso, a ordem inversa de uma lista encadeada simples também pode ser usada dessa forma?
Resposta: 1. Se você usar a primeira ideia, como mover o ponteiro para o último nó para frente?Isso requer um loop para encontrar o endereço do nó anterior que deseja apenas o último nó, o que é mais problemático. 2. Se você usar a segunda ideia, basta escrevê-la no papel. Sinto que pode ser usada. Aqui está uma pequena pergunta para todos pensarem (imite-a com base no método de escrita recursiva acima e veja se pode ser usada ) realizar).
2.Análise
Além das ideias usadas na reversão de strings, existe alguma maneira de completar a reversão desta lista vinculada individualmente com base nas características da lista vinculada?
Ao criar uma lista vinculada, introduzi dois métodos, um é o método de inserção de cabeça e o outro é o método de inserção de cauda. Quais são as características desses dois métodos? Você ainda se lembra? (O link que não me lembro é o seguinte:) Estrutura de dados --- tabela de sequência --- estrutura de armazenamento em cadeia 1 (sem nó líder)_Ainda há blogs desconhecidos esperando para serem explorados-blog CSDN
A característica mais essencial da interpolação principal e da interpolação final é a ordem de armazenamento dos dados e a ordem dos dados de entrada após a criação. O método de interpolação principal é que a ordem de armazenamento é oposta à ordem dos dados de entrada, e o método de interpolação final é que a ordem de armazenamento é igual à ordem dos dados de entrada.
Portanto, de acordo com a ideia de interpolação principal, podemos ler os dados da lista vinculada individualmente, um por um, em ordem, e então usar o método de interpolação principal para criar uma nova lista vinculada para armazenamento? A resposta é sim. Além disso, este método é mais simples que a ideia anterior e incorpora melhor algumas características da lista encadeada.
//O método de inserção do cabeçote não exige julgar se o cabeçote está vazio, o que também foi explicado no artigo anterior.
3.Código
List Reverse( List L )
{
List p=L,head=NULL,q;//创建一个头指针
//头插法不需要对head是否为空进行判断,再之前的文章中也讲解过
while(p!=NULL)
{
q=(List)malloc(sizeof(struct Node));
q->Next=NULL;
q->Data=p->Data;
q->Next=head;
head=q;
p=p->Next;
}
if(L!=NULL)
L->Next=NULL;
return head;
}
Obrigado por seu apoio!