循环双向链表-删除节点

时间:2021-05-03 14:57:48

标签: c list circular-list

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

在我的代码中,有四个功能-添加节点,删除节点,顺时针打印,逆时针打印。除了删除功能之外,我所有的代码都可以正常工作。 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;
}

1 个答案:

答案 0 :(得分:0)

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

使用

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

检查字符串内容是否相等。