我是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");
}
}
}
任何帮助都将不胜感激。谢谢
要从双链接列表中删除节点,需要通过搜索列表来知道节点的指针。
建议将双链接列表的第一项和最后一项链接在一起,形成一个环,这样就没有边界条件(其中节点)-
/* 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% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"