Реализация очереди с использованием кругового связанного списка - PullRequest
0 голосов
/ 13 октября 2019
#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
    struct node *link;
};

void addcll(struct node **, struct node **, int);
void displaycll(struct node *);

void main() 
{
    struct node *front, *rear;

    front = rear = NULL;

    addcll(&front, &rear, 56);
    addcll(&front, &rear, 12);
    displaycll(front);
}

void addcll(struct node **f, struct node **r, int item) {
    struct node *q;
    q = malloc(sizeof(struct node));
    q->data = item;
    if (*f == NULL) {
        *f = q;
    }
    else {
        (*r)->link = q;
        (*r) = q;
        (*r)->link = *f;
    }
}

void displaycll(struct node *f) {
    struct node *q, *p;
    q = f;
    p = NULL;
    while (q != p) {
        printf("%d \n", q->data);
        q = q->link;
        p = f;
    }
}

Невозможно выяснить, где именно ошибка, пожалуйста, помогите! Также я новичок в структурах данных. Пожалуйста, дайте мне несколько советов о книге или онлайн-ресурсах, где я могу изучить и применить на практике эти понятия

1 Ответ

0 голосов
/ 13 октября 2019

Ваш addcll не так. задний указатель должен всегда быть сброшен при возврате в очередь, а ссылка на нажатый узел должна всегда быть установлена ​​на содержимое front, даже в случае, когдапервый узел добавлен, кстати.

void addcll(struct node **f, struct node **r, int item) 
{
    struct node *q = malloc(sizeof(struct node));
    q->data = item;
    if (*f == NULL) {
        *f = q;
    }
    else {
        (*r)->link = q;
    }
    (*r) = q; // here
    (*r)->link = *f; // and here.
}
...