>

링크 된 목록의 결과를 입력 한 순서와 반대로 인쇄하려고합니다. 프로그램은 노래 이름, 노래 길이 (초) 및 저작권의 3 가지 입력을받습니다. 프로그램은 노래 목록을 가져와 입력 한 역순으로 인쇄해야합니다.

링크 된 목록에 익숙하지 않습니다. 데이터베이스로 사용하는 것은 이번이 처음입니다.

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
//defining struct
typedef struct node
{
char songName[20];
int songLength;
int copyright;
struct node * next;
}node;
//defining prototypes
node *create(int n);
void display(node *head);

int main()
{
    int n = 0;
    node *head = NULL;
    printf("How many entries?\n");
    scanf("%d", &n);
    //call to create list
    head = create(n);
    printf("\nThe linked list in order is:\n");
    display(head);
return 0;
}
node *create(int n)
{
node *head = NULL;
node *temp = NULL;
node *p = NULL;
for (int i = 0; i < n; i++)
{
    temp = (node*)malloc(sizeof(node));
    printf("What is the name of song %d\n", i + 1);
    //fgets(temp->songName, 20, stdin);
    scanf("%s", &temp->songName);
    printf("What is the length of song %d (in seconds)?\n", i + 1);
    scanf("%d", &temp->songLength);
    printf("Is song %d copyrighted?(1 = YES, 0 = NO)\n", i + 1);
    scanf("%d", &temp->copyright);
    temp->next = NULL;
    if (head == NULL)
    {
        head = temp;
    }
    else
    {
        // if not empty, attach new node at the end
        p = head;
        while (p->next != NULL)
        {
            p = p->next;
        }
        p->next = temp;
    }
}
return head;
}
void display(node *head)
{
    node *p = NULL;
    if (head == NULL)
    {
        printf("List is empty\n");
    }
    else
    {
            p = head;
        while (p != NULL)
        {
        printf("Song: %s, ", p->songName);
        printf("%d minutes, ", p->songLength);
        if (p->copyright == 1)
        {
            printf("Copyrighted\n");
        }
        else if (p->copyright == 0)
        {
            printf("No copyright\n");
        }
            p = p->next;
    }
}
}

다음을 입력하면 :

노래 1-올스타 (노래 이름), 237 (초), 0 (저작권 없음)

노래 2-Crab Rave, 193, 0

노래 3-7 개의 링, 185, 1 (저작권)

출력은 다음과 같아야합니다 :

7 개의 고리, 185, 1

크랩 레이브, 193, 0

올스타, 237, 0

  • 답변 # 1

    단일 (앞으로) 연결된 목록이있는 경우 역순으로 인쇄하는 가장 쉬운 방법은 재귀를 사용하는 것입니다.

    void display_recursive(node *n) {
        if (!n) {
          return;
        }
        display_recursive(n->next);
        printf("Song: %s, ", n->songName);
        ...
    }
    
    

    재귀는 함수가 자신을 호출 함을 의미합니다 (일부 조건, 앵커에 도달 할 때까지). 이런 식으로 프로그램 흐름은 첫 번째 노드에 이어 두 번째 노드와 함께 마지막 노드에 도달 할 때까지 display_recursive 함수 호출의 "스택"을 구성합니다. 그러면 재귀가 중지되고 마지막 노드부터 거꾸로 시작하여 display_recursive의 인쇄 부분이 처리됩니다.

    이 설명이 도움이되기를 바랍니다. 무슨 일이 일어나는지 디버거에서 사용해보십시오.

관련 자료

  • 이전 XPath"for"표현식을 사용하는 방법?
  • 다음 javascript - onKeyup 이벤트 myfunction이 list obj의 텍스트 상자에 입력 한대로 일치하는 예상 데이터를 반환하지 않습니다 목록에서 데이터를 필터링해야합니다