Materiales de revisión de la estructura de datos

Temas de tareas de MOOC

coincidencia de patrones de cuerdas

Establezca la cadena principal S = 'abcaabbabcabaacbacba', la cadena de patrón P = 'abcabaa'

(1) Calcule el valor siguiente y el valor de la función nextval de la cadena de patrón P;

(2) En lugar de escribir el algoritmo, solo dibuje el proceso de coincidencia de cada viaje cuando use el algoritmo KMP (usando el valor nextval mejorado) para la coincidencia de patrones.

(Puede consultar el formulario de descripción del proceso de coincidencia en la Figura 4.3 y la Figura 4.4 en la página 80 del libro de texto. Tenga en cuenta los valores de i y j al final de cada coincidencia después de cada coincidencia).

inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

Codificación Huffman

Suponga que el mensaje utilizado para la comunicación consta de letras en el conjunto de caracteres {a, b, c, d, e, f, g}. La frecuencia de su aparición en el mensaje es {0.31, 0.16, 0.10, 0.08, 0.11, 0.20, 0.04},

1) Diseñe la codificación Huffman para estas 7 letras;

2) Para diseñar un código de igual longitud para estas 7 letras, ¿cuántos dígitos binarios se necesitan como mínimo?

3) ¿Cuánto comprime la codificación Huffman la longitud total del mensaje en comparación con la codificación de igual longitud?

(1) ligeramente

(2) 3 dígitos

(3)

Longitud de código de igual longitud: (0,31+0,16+0,1+0,08+0,11+0,2+0,04)x3=3

Longitud del código Huffman: 0,31x2+0,16x3+0,1x3+0,08x4+0,11x3+0,2x2+0,04x4=2,61

(3 - 2,61) / 3 = 13%

Síntesis de grafos

Hay 7 ciudades en un determinado país y no hay carretera entre ellas, por lo que el tráfico es muy inconveniente. Para resolver el problema de los "caminos difíciles", el gobierno decidió construir caminos. Después de la investigación, si la relación entre estas 7 ciudades se ve como un gráfico, las letras representan los nombres de las ciudades y los números representan el costo. de la construcción de carreteras:

imagen-20230619114720806

(1) Dibuje la lista de adyacencia correspondiente al gráfico y escriba las secuencias transversales primero en profundidad y primero en anchura

(2) Para ahorrar dinero al máximo, el gobierno solo permite la construcción de 6 carreteras, y las 7 ciudades se pueden conectar a través de estas 6 carreteras. Comience desde la ciudad A y use el algoritmo de Prim para llevar a cabo las 6 carreteras. Elija dibujar el proceso de solución.

Sugerencia: La respuesta de la lista de adyacencia de un gráfico no es única, pero la respuesta de la secuencia transversal correspondiente a la lista de adyacencia es única.

El gráfico es un gráfico ponderado y la información de peso de cada borde también se almacena en la lista de adyacencia.

(1)

imagen-20230619114826083

Secuencia DFS: ABCDFEG

Secuencia BFS: ABDGCFE

(2)

imagen-20230619114903034

Con referencia al libro de texto P174, también es necesario dibujar una tabla similar a la Figura 7.17

Árbol de clasificación binario equilibrado

Ingrese los elementos en la tabla (30, 15, 28, 20, 24, 10, 68, 35, 50) en secuencia para generar un árbol de clasificación binario balanceado.

Dibuje el proceso de construcción e indique el tipo de cada balanza (tipo LL, tipo RR, tipo LR, tipo RL)

imagen-20230619115320945

tabla de picadillo

Dado un conjunto de palabras clave de búsqueda (32, 15, 7, 11, 4, 28, 56, 61, 79), la longitud de la tabla hash es m = 12, diseñe una función hash de acuerdo con el resto La probabilidad de encontrar cada registro es igual.

(1) Dibuje la tabla hash obtenida mediante el procesamiento de conflictos de acuerdo con la detección lineal y luego el hash (proporcione el proceso de solución), y calcule la longitud de búsqueda promedio cuando la búsqueda es exitosa y la búsqueda falla bajo la condición de igualdad de probabilidad.

(2) Dibuje la tabla hash obtenida mediante el procesamiento de conflictos de acuerdo con el método de dirección de la cadena, y calcule las longitudes de búsqueda promedio cuando la búsqueda tiene éxito y falla cuando la búsqueda es igualmente probable.

(1)

inserte la descripción de la imagen aquí

(2)

inserte la descripción de la imagen aquí

tema de la Asociación de Padres y Maestros

Solo debe probar tablas lineales, árboles

6-1 Eliminación de intervalos de elementos de tablas lineales

Dada una tabla lineal almacenada secuencialmente, diseñe una función para eliminar todos los elementos cuyos valores sean mayores que el mínimo y menores que el máximo. Después de la eliminación, los elementos restantes de la tabla se almacenan secuencialmente y sus posiciones relativas no se pueden cambiar.

Definición de interfaz de función:

List Delete( List L, ElementType minD, ElementType maxD );
List Delete(List L, ElementType minD, ElementType maxD) {
     
     
       int i, p = 0;
       for (i = 0; i <= L->Last; i++) {
     
     
           if (L->Data[i] <= minD || L->Data[i] >= maxD) {
     
     
               L->Data[p++] = L->Data[i];
           }
       }
       L->Last = p - 1;
       return L;
}

6-2 Inserción en una lista ordenada

Suponiendo que los elementos de datos en la tabla de secuencias están organizados en un orden no decreciente por valor, intente escribir un algoritmo para insertar x en la posición adecuada de la tabla de secuencias para mantener el orden de la tabla de secuencias.

Definición de interfaz de función:

void ListInsertSort(SqList *L, DataType x);

Donde Ly xson parámetros pasados ​​por el usuario. LIndica la tabla de secuencia, xque es el elemento a insertar.

void ListInsertSort(SqList *L, DataType x) {
     
     
       int i;
       int temp = 1;

       for (i = 0; L->items[i] < x; i++) {
     
     
           temp++;
       }

       ListInsert(L,temp,x);
    
}

6-3 Fusionando dos arreglos ordenados

Se requiere implementar una función merge para fusionar la matriz ascendente a de longitud m y la matriz ascendente b de longitud n en una nueva matriz c, y la matriz fusionada aún se organiza en orden ascendente.

Definición de interfaz de función:

void printArray(int* arr, int arr_size);           /* 打印数组,细节不表 */
void merge(int* a, int m, int* b, int n, int* c);  /* 合并a和b为c */

Donde a y b son matrices dispuestas en orden ascendente, m y n son las longitudes de las matrices a y b respectivamente; c es la matriz fusionada en orden ascendente.

void merge(int *a, int m, int *b, int n, int *c) {
     
     
       int i, j, k;
       while (i < m && j < n) {
     
     
           if (a[i] < b[j])
               c[k++] = a[i++];
           else
               c[k++] = b[j++];
       }
       while (i < m) {
     
     
           c[k++] = a[i++];
       }
       while (j < n) {
     
     
           c[k++] = b[j++];
       }
}

6-4 Conjunto de operación de lista de secuencias

Esta pregunta requiere la implementación del conjunto de operaciones de la tabla de secuencia.

Definición de interfaz de función:

List MakeEmpty(); 
Position Find( List L, ElementType X );
bool Insert( List L, ElementType X, Position P );
bool Delete( List L, Position P );

donde Listla estructura se define de la siguiente manera:

typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /* 保存线性表中最后一个元素的位置 */
};

La definición de cada función de operación es:

List MakeEmpty(): crea y devuelve una tabla lineal vacía;

Position Find( List L, ElementType X ): Devuelve la posición de X en la tabla lineal. Devuelve ERROR si no se encuentra;

bool Insert( List L, ElementType X, Position P ): Inserte X en la posición P y devuelva verdadero. Si el espacio está lleno, imprime "LLENO" y devuelve falso; si el parámetro P apunta a una posición ilegal, imprime "POSICIÓN ILEGAL" y devuelve falso;

bool Delete( List L, Position P ): Elimina el elemento en la posición P y devuelve verdadero. Si el parámetro P apunta a una posición no válida, imprima "POSICIÓN P VACÍA" (donde P es el valor del parámetro) y devuelva falso.

List MakeEmpty() {
     
     
       List list;
       list = (List) malloc(sizeof(struct LNode));
       list->Last = -1;
       return list;
}

Position Find(List L, ElementType X) {
     
     
       int i;
       for (i = 0; i < MAXSIZE; i++) {
     
     
           if (L->Data[i] == X)
               return i;
       }
       return ERROR;
}

bool Insert(List L, ElementType X, Position P) {
     
     
       int i;

       if (L->Last == MAXSIZE - 1) {
     
     
           printf("FULL");
           return false;
       }

       if (P < 0 || P > L->Last + 1) {
     
     
           printf("ILLEGAL POSITION");
           return false;
       }

       for (i = L->Last; i >= P; i--) {
     
     
           L->Data[i + 1] = L->Data[i];
       }
       L->Data[P] = X;
       L->Last++;
       return true;

}

bool Delete(List L, Position P) {
     
     
       int i;

       if (P < 0 || P > L->Last) {
     
     
           printf("POSITION %d EMPTY", P);
           return false;
       }

       for (i = P; i < L->Last; i++) {
     
     
           L->Data[i] = L->Data[i + 1];
       }
       L->Last--;

       return true;
}

6-5 Inserción de una lista vinculada de secuencias enteras incrementales

Esta pregunta requiere implementar una función para insertar un nuevo entero en la lista vinculada de secuencias de enteros crecientes (nodo principal) y mantener el orden de la secuencia.

Definición de interfaz de función:

List Insert( List L, ElementType X );

donde Listla estructura se define de la siguiente manera:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

LEs una lista dada con un solo enlace con el nodo principal, y los datos almacenados en los nodos están en orden creciente; la función Insertinsertará y mantendrá el orden de la secuencia, y devolverá el puntero del encabezado de la lista enlazada después de la inserción.XL

List Insert(List L, ElementType X) {
     
     
       List p, s;
       p = L;
       s = (List) malloc(sizeof(struct Node));
       s->Data = X;

       while (p->Next && p->Next->Data < X) {
     
     
           p = p->Next;
       }
       s->Next = p->Next;
       p->Next = s;

       return L;
}

6-6 Eliminar los nodos pares de la lista enlazada individualmente

Esta pregunta requiere la implementación de dos funciones, que respectivamente almacenan los datos leídos como una sola lista enlazada y eliminan los nodos con valores pares en la lista enlazada. Los nodos de lista enlazada se definen de la siguiente manera:

struct ListNode {
    int data;
    struct ListNode *next;
};

Definición de interfaz de función:

struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );

La función createlistlee una serie de enteros positivos de la entrada estándar y construye una lista enlazada individualmente en el orden en que se leen. Cuando se lee −1, significa que la entrada ha terminado y la función debe devolver un puntero al nodo principal de la lista enlazada individualmente.

La función elimina los nodos con valores pares en deleteevenla lista enlazada individualmente y devuelve el puntero principal de la lista enlazada resultante.head

struct ListNode *createlist() {
     
     
    int m;
    struct ListNode *p, *s, *l;
    p = (struct ListNode *) malloc(sizeof(struct ListNode));

    scanf("%d", &m);
    if (m == -1)
        return NULL;
    p->data = m;
    p->next = NULL;
    s = p;

    while (1) {
     
     
        scanf("%d", &m);
        if (m == -1)
            break;
        l = (struct ListNode *) malloc(sizeof(struct ListNode));
        l->data = m;
        l->next = NULL;
        s->next = l;
        s = l;
    }
    return p;

}

struct ListNode *deleteeven(struct ListNode *head) {
     
     
    struct ListNode *p = NULL, *s = NULL;

    while (head && head->data % 2 == 0) {
     
     
        p = head;
        head = head->next;
        free(p);
    }
    if (head == NULL)
        return NULL;
    s = head;
    while (s->next) {
     
     
        if (s->next->data % 2 == 0)
            s->next = s->next->next;
        else
            s = s->next;
    }
    return head;
}

6-7 Crear una lista enlazada con datos inversos

Esta pregunta requiere la implementación de una función para crear una lista enlazada en el orden inverso de los datos de entrada.

Definición de interfaz de función:

struct ListNode *createlist();

La función createlistutiliza scanfpara obtener una serie de enteros positivos de la entrada, y cuando lee −1, significa el final de la entrada. Cree una lista vinculada en el orden inverso de los datos de entrada y devuelva el puntero del encabezado de la lista vinculada. La estructura del nodo de lista enlazada se define de la siguiente manera:

struct ListNode {
    int data;
    struct ListNode *next;
};
struct ListNode *createlist() {
     
     
    int m;
    struct ListNode *head, *p;
    head = (struct ListNode *) malloc(sizeof(struct ListNode));
    head->next = NULL;

    while (1) {
     
     
        scanf("%d", &m);
        if (m == -1)
            break;
        p = (struct ListNode *) malloc(sizeof(struct ListNode));
        p->next = head->next;
        p->data = m;
        head->next = p;
    }
    return head->next;
}

6-8 Encuentra el último elemento m-ésimo de la lista enlazada

Diseñe un algoritmo que sea lo más eficiente posible en términos de tiempo y espacio, y encuentre el penúltimo elemento m (>0) de la lista lineal almacenada en una cadena sin cambiar la lista enlazada.

Definición de interfaz de función:

ElementType Find( List L, int m );

donde Listla estructura se define de la siguiente manera:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

LEs la lista enlazada simple dada con el nodo principal; la función Finddevolverá Lel penúltimo melemento sin cambiar la lista enlazada original. Si no existe tal elemento, se devuelve un indicador de error ERROR.

ElementType Find(List L, int m) {
     
     
    int i;
    PtrToNode p, s;
    p = s = L;

    for (i = 0; i < m; i++) {
     
     
        p = p->Next;
        if (!p)
            return ERROR;
    }
    while (p) {
     
     
        s = s->Next;
        p = p->Next;
    }

    return s->Data;
}

6-9 Fusión de dos secuencias de listas enlazadas ordenadas

Esta pregunta requiere la implementación de una función que combine las secuencias de enteros crecientes representadas por dos listas enlazadas en una secuencia de enteros no decreciente.

Definición de interfaz de función:

List Merge( List L1, List L2 );

donde Listla estructura se define de la siguiente manera:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L1La suma es L2una lista enlazada simple dada con el nodo principal, y los datos almacenados en los nodos están en orden creciente; la función combinará la suma en una secuencia no decreciente de números enteros. Los nodos en la secuencia original se deben usar directamente y se debe devolver el puntero del encabezado de la lista enlazada del nodo principal fusionado.MergeL1L2

List Merge( List L1, List L2 )
{
     
     
    List pa,pb,pc;
    pa=L1->Next;
    pb=L2->Next;
    List L=(List)malloc(sizeof(List));
    pc=L;
    
    while(pa&&pb)
    {
     
     
        if(pa->Data>pb->Data)
        {
     
     
            pc->Next=pb;
            pb=pb->Next;
        }
        else{
     
     
            pc->Next=pa;
            pa=pa->Next;
        }
        pc=pc->Next;
    }
    
    if(pa)
        pc->Next = pa;
    if(pb)
        pc->Next = pb;
    L1->Next=NULL;
    L2->Next=NULL;
    
    return L;
}

6-10 Recorrido de árbol binario

El problema requiere 4 recorridos de un árbol binario dado.

Definición de interfaz de función:

void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

donde BinTreela estructura se define de la siguiente manera:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

Las cuatro funciones son necesarias para imprimir el contenido de los nodos en el orden de acceso, y el formato es un espacio seguido de un carácter.

void InorderTraversal(BinTree BT) {
     
     //中序遍历
    if (BT) {
     
     
        InorderTraversal(BT->Left);
        printf(" %c", BT->Data);
        InorderTraversal(BT->Right);
    }
}

void PreorderTraversal(BinTree BT) {
     
     //先序遍历
    if (BT) {
     
     
        printf(" %c", BT->Data);
        PreorderTraversal(BT->Left);
        PreorderTraversal(BT->Right);
    }
}

void PostorderTraversal(BinTree BT) {
     
     //后序遍历
    if (BT) {
     
     
        PostorderTraversal(BT->Left);
        PostorderTraversal(BT->Right);
        printf(" %c", BT->Data);
    }
}

void LevelorderTraversal(BinTree BT) {
     
     
    BinTree B[100];//结构体数组
    BinTree T;
    int i = 0, j = 0;
    if (!BT)return;//树为空,返回
    if (BT)//不为空
    {
     
     
        B[i++] = BT;//根节点入队
        while (i != j)//队列不空
        {
     
     
            T = B[j++];//出队
            printf(" %c", T->Data);
            if (T->Left) B[i++] = T->Left;
            if (T->Right) B[i++] = T->Right;
        }
    }
} 

6-11 Recorrido no recursivo de un árbol binario

Esta pregunta requiere un método no recursivo para implementar tres recorridos de un árbol binario dado.

Definición de interfaz de función:

void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );

donde BinTreela estructura se define de la siguiente manera:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
    int flag;
};

Las tres funciones son necesarias para imprimir el contenido de los nodos según el orden de acceso, y el formato es un espacio seguido de un carácter.

void InorderTraversal( BinTree BT ){
     
     //中序遍历
    BinTree T=BT;
    Stack S =CreateStack();
    while(T||!IsEmpty(S)){
     
     
        while(T!=NULL){
     
     
            Push(S,T);
            T=T->Left;
        }
        T=Pop(S);
        printf(" %c",T->Data);
        T=T->Right;
    }
}
void PreorderTraversal( BinTree BT ){
     
     //先序遍历
    BinTree T=BT;
    Stack S =CreateStack();
    while(T||!IsEmpty(S)){
     
     
        while(T!=NULL){
     
     
            Push(S,T);
            printf(" %c",T->Data);
            T=T->Left;
        }
        T=Pop(S);
        T=T->Right;
    }
}
void PostorderTraversal( BinTree BT ){
     
     //后序遍历
    BinTree T=BT;
    Stack S =CreateStack();
    while(T||!IsEmpty(S)){
     
     
        while(T!=NULL){
     
     
            T->flag=0;
            Push(S,T);
            T=T->Left;
        }
        T=Peek(S);
        if(T->flag==0){
     
     
            T->flag++;
            T=T->Right;
        }
        else{
     
     
            T=Pop(S);
            printf(" %c",T->Data);
            T=NULL;
        }
    }
}

6-12 Encuentra la altura del árbol binario

Esta pregunta requiere la altura de un árbol binario dado.

Definición de interfaz de función:

int GetHeight( BinTree BT );

donde BinTreela estructura se define de la siguiente manera:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

Se requiere la función para devolver el valor de altura del árbol binario BT dado.

int GetHeight(BinTree BT) {
     
     
   int lNum, rNum, Height;
   if (BT) {
     
     
       lNum = GetHeight(BT->Left);
       rNum = GetHeight(BT->Right);
       if (lNum > rNum)
           Height = lNum;
       else
           Height = rNum;
       return Height + 1;
   } else {
     
     
       return 0;
   }
}

6-13 Recorrido primero en profundidad de un gráfico de memoria de matriz de adyacencia

Intente implementar un recorrido primero en profundidad de un gráfico de almacenamiento de matriz de adyacencia.

Definición de interfaz de función:

void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );

donde MGraphes el gráfico almacenado por la matriz de adyacencia, definida de la siguiente manera:

typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;  /* 顶点数 */
    int Ne;  /* 边数   */
    WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */

La función DFSatravesará Vel gráfico recursivamente, primero en profundidad, comenzando desde el vértice, y visitará cada vértice Graphcon una función definida por el árbitro . VisitAl visitar puntos adyacentes, se requiere seguir el orden creciente del número de secuencia. Se garantiza que el título Ves un vértice legal en el gráfico.

void DFS(MGraph Graph, Vertex V, void (*Visit)(Vertex)) {
     
     
   Vertex i;
   Visit(V);
   Visited[V] = true;
   for (int i = 0; i < Graph->Nv; i++) {
     
     
       if (Graph->G[V][i] == 1 && !Visited[i]) {
     
     
           DFS(Graph, i, Visit);//进行递归
       }
   }
}

6-14 Recorrido primero en amplitud de un gráfico de almacenamiento de lista de adyacencia

Es posible que el contenido de la imagen no se haya probado, puede echar un vistazo

Intente implementar el recorrido primero en anchura del gráfico de almacenamiento de la lista de adyacencia.

Definición de interfaz de función:

void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );

donde LGraphestá el gráfico almacenado en la lista de adyacencia, definida de la siguiente manera:

/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode; 
struct AdjVNode{
    
    
    Vertex AdjV;        /* 邻接点下标 */
    PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
};

/* 顶点表头结点的定义 */
typedef struct Vnode{
    
    
    PtrToAdjVNode FirstEdge; /* 边表头指针 */
} AdjList[MaxVertexNum];     /* AdjList是邻接表类型 */

/* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{
    
      
    int Nv;     /* 顶点数 */
    int Ne;     /* 边数   */
    AdjList G;  /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */

La función BFSdebe realizar una búsqueda primero en anchura en Sel gráfico almacenado en la lista de adyacencia a partir del vértice y usar la función definida por el árbitro para acceder a cada vértice Graphal atravesar . VisitAl visitar puntos de adyacencia, se requiere visitar en orden de lista de adyacencia. Se garantiza que el título Ses un vértice legal en el gráfico.

void BFS(LGraph Graph, Vertex S, void (*Visit)(Vertex)) {
     
     
   Visited[S] = true;//标记起始点
   Visit(S);
   int queue[1000], front = 0, rear = 0;
   queue[rear++] = S;//起始点入队列
   PtrToAdjVNode temp;//temp就代表当前点的邻接点的下标
   while (front < rear) {
     
     //队伍不为空
       temp = Graph->G[queue[front++]].FirstEdge;
       while (temp) {
     
     
           int p = temp->AdjV;//把temp中的下标提取出来
           if (!Visited[p]) {
     
     //如果p点没有被标记的话
               Visited[p] = true;
               Visit(p);
               queue[rear++] = p;//储存在队列中
           }
           temp = temp->Next;//指向下一个邻接点
       }
   }
}

GNode LGraph; /* tipo de gráfico almacenado en la lista de adyacencia */


**函数`BFS`应从第`S`个顶点出发对邻接表存储的图`Graph`进行广度优先搜索,遍历时用裁判定义的函数`Visit`访问每个顶点。当访问邻接点时,要求按邻接表顺序访问。题目保证`S`是图中的合法顶点。**

>```c
>void BFS(LGraph Graph, Vertex S, void (*Visit)(Vertex)) {
>    Visited[S] = true;//标记起始点
>    Visit(S);
>    int queue[1000], front = 0, rear = 0;
>    queue[rear++] = S;//起始点入队列
>    PtrToAdjVNode temp;//temp就代表当前点的邻接点的下标
>    while (front < rear) {//队伍不为空
>        temp = Graph->G[queue[front++]].FirstEdge;
>        while (temp) {
>            int p = temp->AdjV;//把temp中的下标提取出来
>            if (!Visited[p]) {//如果p点没有被标记的话
>                Visited[p] = true;
>                Visit(p);
>                queue[rear++] = p;//储存在队列中
>            }
>            temp = temp->Next;//指向下一个邻接点
>        }
>    }
>}

Supongo que te gusta

Origin blog.csdn.net/qq_61228493/article/details/131318484
Recomendado
Clasificación