【问题标题】:Circular Doubly Linked List- Delete node循环双向链表-删除节点
【发布时间】:2021-05-03 14:57:48
【问题描述】:

我正在构建循环双向链表代码。

在我的代码中,有四个函数——添加节点、删除节点、顺时针打印、逆时针打印。除了删除功能外,我所有的代码都可以正常工作。 if(recycle->name == x) 行似乎无法正常工作,free(recycle) 也没有成功释放回收节点。

我的原始代码是。如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define nameLen 20

struct Node
{
    char name[nameLen];
    struct Node *left; //next
    struct Node *right; //previous
};
struct Node* current;
struct Node* head;
int count = 0;

struct Node* GetNewNode(char *x)
{
    struct Node* newNode;
    
    newNode = (struct Node*)malloc(sizeof(struct Node));
    strncpy(newNode->name, x, nameLen);
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

void add_name(char *x)
{
    struct Node* temp = current;
    struct Node* newNode = GetNewNode(x);
    count++;
    if(current == NULL)
    {
        current = newNode;
        head = current;
    }
    else
    {
        current->left = newNode;
        newNode->right = temp;
        current = newNode;
        current->left = head;
        head->right = current;
    }
    printf("Add %s into database.\n\n", current->name);
}

void delete_name(char *x)
{
    int i, j;
    struct Node* recycle = current;
    if(current == NULL)
    {
        printf("No data input.");
    }
    else
    {
        for (i = 0; i < count; i++)
        {
            if(recycle->name == x)
            {
                free(recycle);
                j++;
                printf("Delete %s from database.\n", x);
            }
            recycle = recycle->left;
        }
        if(j == 0)
        {
            printf("There is no %s in data", x);
        }
        current = recycle;
    }
}

void print_clock(int number)
{
    int i;
    struct Node* temp = current;

    if(temp == NULL)
    {
        printf("No data input.");
    }
    else
    {
        printf("Clockwise: \n");
        for(i = 0; i < number; i++)
        {
            printf("%s ",temp->name);
            temp = temp->left;
        }
    }
    printf("\n\n");
}

void print_counter(int number)
{
    int i;
    struct Node* temp = current;
    if(temp == NULL)
    {
        printf("No data input.");
    }
    else
    {
        printf("Counterclockwise: \n");
        for(i = 0; i < number; i++)
        {
            printf("%s ",temp->name);
            temp = temp->right;
        }
    }
    printf("\n\n");
}



int main()
{
    char s1;
    char s2[nameLen];

    char name[nameLen];
    int number;
    
    while(1)
    {
        printf("Enter the instruction: ");
        scanf("%s %s", &s1, s2);

        if (s1 == '+' && sscanf(s2, "%d", &number) == 1)
        {
            printf("Print out %d name(s) clockwise.\n", number);
            print_clock(number);
        }
        else if (s1 == '-' && sscanf(s2, "%d", &number) == 1)
        {
            printf("Print out %d name(s) counterclockwise.\n", number);
            print_counter(number);
        }
        else if (s1 == '+' && sscanf(s2, "%s", name) == 1)
        {
            add_name(s2);
        }
        else if (s1 == '-' && sscanf(s2, "%s", name) == 1)
        {
            delete_name(s2);
        }
        else if (s1 == 'e')
        {
            printf("Bye.\n");
            break;
        }
        else // No match.
            printf("Wrong Input. %s %s\n", &s1, s2);
    }

    system("pause");
    return 0;
}

【问题讨论】:

    标签: c list circular-list


    【解决方案1】:

    语句recycle-&gt;name == x 检查两个指针​​是否指向内存中的同一个对象。它不检查内存中的两个(不同)对象是否具有相同的内容。

    使用

    if (strcmp(recycle->name, x) == 0) { ...
    

    检查相等的字符串内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多