繁体   English   中英

循环双向链表-删除节点

[英]Circular Doubly Linked List- Delete node

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

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

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

利用

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

检查相等的字符串内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM