当前位置: 首页 > 知识库问答 >
问题:

双链表中的Delete函数

姬朗
2023-03-14

我是C语言的新手,正在尝试使用双链表创建一个电话簿应用程序。但是,我无法确定如何删除联系人,即此人的名字、姓氏和号码,并将上一个节点链接到下一个节点。我已经附上下面的代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void create(int,char*,char*);
void search();
void display();
void del();


struct node
{
    struct node *before;
    int data;
    char fname[50];
    char lname[50];
    struct node* after;
};

struct node* head;

int main()
{
    printf("WELCOME TO PHONE DIRECTORY");
    int item,choice;
    char surname[50];
    char lastname[50];
    do
    {
        printf("\n1.CREATE\n2.SEARCH\n3.DELETE\n 4.EXIT\n 5.DISPLAY \n 6.ENTER YOUR CHOICE:");
        scanf("%d",&choice);
        switch (choice)
        {
        case 1:
            printf("ENTER NUMBER:");
            scanf("%d",&item);
            printf("ENTER FIRST NAME:");
            scanf("%s",surname);
            printf("ENTER LAST NAME:");
            scanf("%s",lastname);
            create (item,surname,lastname);
            break;

        case 2:
        search();
        break;

        case 3:
        del();
        break;

        case 4:
        return;
        break;

        case 5:
        display();
        break;

        default:
        printf("\n INVALID NUMBER");
            break;
        }
    } while (choice!=4);
    }

//DISPLAY FUNCTION
void display()
{
    struct node* temp=head;
    if(temp==NULL)
    {
        printf("LIST IS EMPTY");
    }
    while(temp!=NULL)
    {
        printf("%d-> \n",temp->data);
        printf("%s-> \n",temp->fname);
        printf("%s-> \n\n",temp->lname);
        temp=temp->after;
    }
}

//CREATE FUNCTION
void create(int item,char *surname,char *lastname)
{
    struct node *newNode=(struct node*) malloc(sizeof(struct node));
    struct node* temp;
    if(newNode==NULL)
    {
        printf("OVERFLOW");

    }
    else
    {
        newNode->data=item;
        strcpy(newNode->fname,surname);
        strcpy(newNode->lname,lastname);
        if(head==NULL)
        {
            newNode->before=NULL;
            newNode->after=NULL;
            head=newNode;
            printf("FIRST NODE INSERTED %d %s %s",item,surname,lastname);
    }

    else
    {
        temp=head;
        while(temp->after!=NULL)
        {
            temp=temp->after;
        }
        temp->after=newNode;
        newNode->before=temp;
        newNode->after=NULL;
        printf("\n Node inserted %d %s %s",item,surname,lastname);
    }
}
}

//DELETE FUNCTION
void del()
{
    struct node *pretemp,*temp;
    char *f,*l;
    int num;
    temp=head;
    pretemp=head->after;
    printf("Enter name and number :");
    scanf("%s",&f);
    scanf("%s",&l);
    scanf("%d",&num);
    
    while(temp!=NULL)
    {
        if((pretemp->fname==f)&&(pretemp->lname==l)&&(pretemp->data==num))
        {
            printf("%s ",temp->fname);
            printf("%s ",temp->lname);
            printf("%d ",temp->data);
            temp->after=pretemp->after;
            free(pretemp);
            break;
        }
        else
        {
            temp=temp->after;
            pretemp=pretemp->after;
        }
    }
}
//SEARCH FUNCTION
void search()
{
    struct node* temp;
    int item,i=0,flag;
    char name[50];
    temp=head;
    if(head==NULL)
    {
        printf("\n LIST IS EMPTY");

    }
    else
    {
        printf("ENTER THE NUMBER AND FIRST NAME TO BE SEARCHED: ");
        scanf("%d %s",&item,&name);
        while(temp!=NULL)
        {
            if(temp->data==item)
            {
                printf("ITEM FOUND AT LOCATION %d",i+1);
                flag=0;
                break;
            }
            else if(temp->fname==name)
            {
                printf("ITEM FOUND AT LOCATION %s",i+1);
                flag=0;
                break;
            }
            else
            {
                flag=1;
            }
            i++;
            temp=temp->after;

        }
        if(flag==1)
        {
            printf("\n ITEM NOT FOUND");
        }
    }

}


任何帮助都将不胜感激。谢谢

共有1个答案

能向晨
2023-03-14

要从双链接列表中删除节点,需要通过搜索列表来知道节点的指针。

建议将双链接列表的第一项和最后一项链接在一起,形成一个环,这样就没有边界条件(其中节点)-

/* works in a circular doubly linked list, where the first item (*list)
   is linked with the last item of the list */
/* returns the list after the node is removed */
struct node* remove_node(struct node *list, struct node *node)
{
    assert(list != NULL);
    assert(node != NULL);
   
    /* node must be in a list to be removed */
    assert(node->before != NULL);
    assert(node->after != NULL);

    /* removing head */
    if (list == node)
    {
        /* move head to next node */
        list = list->after;

        /* still the same node (only one node in list) */
        if (list == node)
            list = NULL;
    }

    /* Linking the previous and next node together will 
       effectively remove the node from the list */
    node->before->after = node->after;
    node->after->before = node->before;

    /* this is not necessary but recommended for error checking */
    node->before = NULL;
    node->after = NULL;

    return list;
}

 类似资料:
  • 双链表节点是在main函数中创建的。Ender和header已定义。在删除节点函数处中断-ender为空。 释放最后一个和第一个输入的内存的最佳方法是什么,即:删除:233,A和888,F?

  • 我在JavaScript中构建链表。我有一个部分不明白。 问题是插入函数! 假设我已经有了一个B C节点。 我想在B后面插入K。 当前,B的下一个和上一个分别是C和A。 C的前一个元素是B。 一旦我把K放在B后面, a B K C (1)K的下一个元素将是C (2)K的前一个元素将是B (3)B的下一个元素是K (4)C的前一个元素是K。 在我在Insert函数中编写的代码中,下面的每一行代码都应

  • 我写了一个程序,通过双链表管理银行账户,但我发现取消程序有问题。 我仍然有同样的问题,即使我尝试了这个方法:-(pnt)-

  • 我必须实现类"DoubleChainedList"和"Elem"。DoubleChainedList管理一个双链列表,Elem是关联的节点类,指针指向后继节点和前驱节点。 我必须实施以下方法: public void removeAtIndex(int i)//删除位置i处的元素 public int[]toArray()//将列表作为数组返回 双链列表 要素: 我的问题:它显示了以下错误:hea

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 主要内容:双向链表的创建目前我们所学到的 链表,无论是动态链表还是 静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为 单向链表(或 单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"