从链表中删除节点 [英] Delete Node from linkedlist
问题描述
我写了一部电话簿,现在我编写了一个删除功能,它可以在实体之间进行搜索但是如果我调用搜索然后删除它,我不知道如何很好地使用它?我应该在搜索功能上加一个标志吗?我想当用户输入任何数字,电子邮件,...时如果存在,将其删除我不知道删除功能是否正确第一次假设链接列表不为空
I wrote a phone book it can search among entities now I wrote a delete function but I don't know how to use it in a good manner if I call search and then delete it how? i should give a flag on search function? I want to when user entered any Number,Email,... if there exists delete it I don't know my function in delete is correct or not suppose for the first time the linked list is not empty
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
struct node {
char Number[10];
char FirstName[10];
char LastName[10];
char FatherName[10];
char Email[20];
char SiteName[30];
struct node *next;
struct node *pre;
};
void print(struct node* list)
{
printf("FIRSTNAME: ");
printf(list->FirstName);
printf("\n");
printf("LASTNAME: ");
printf(list->LastName);
printf("\n");
printf("FATHERNAME: ");
printf(list->FatherName);
printf("\n");
printf("EMAIL: ");
printf(list->Email);
printf("\n");
printf("SITENAME: ");
printf(list->SiteName);
printf("\n");
printf("NUMBER: ");
printf(list->Number);
}
void search(struct node* list,char* sr,int option)
{
struct node *current =list;
current=current->next;
switch(option)
{
case 1:
while(current!=0)
{ int flag=strcmp(current->Number,sr);
if(flag==0)
{ printf("you searched This person!\n");
print(current);
current=current->next;
}
else{
current=current->next;
}
}
break;
case 2:
while(current!=0)
{
int flag=strcmp(current->FirstName,sr);
if(flag==0)
{ printf("you searched This person!\n");
print(current);
current=current->next;
}
else{
current=current->next;
}
} break;
case 3:
while(current!=0)
{
int flag=strcmp(current->LastName,sr);
if(flag==0)
{ printf("you searched This person!\n");
print(current);
current=current->next;
}
else{
current=current->next;
}
}
break;
case 4:
while(current!=0)
{
int flag=strcmp(current->FatherName,sr);
if(flag==0)
{ printf("you searched This person!\n");
print(current);
current=current->next;
}
else{
current=current->next;
}
}
break;
case 5:
while(current!=0)
{
int flag=strcmp(current->Email,sr);
if(flag==0)
{ printf("you searched This person!\n");
print(current);
current=current->next;
}
else{
current=current->next;
}
}
break;
case 6:
while(current!=0)
{
int flag=strcmp(current->SiteName,sr);
if(flag==0)
{ printf("you searched This person!\n");
print(current);
current=current->next;
}
else{
current=current->next;
}
}
break;
}
}
void deleteNode(struct node* node)
{
if(node->next==0 && node->pre==0)//we have just 1 node
{
free(node);
}
if(node->next!=0 && node->pre!=0)//node is among nodes
{
struct node * temp1 = node->next;
struct node * temp2 = node->prev;
temp2->next=node->next;
temp1->pre=temp2;
free(node);
}
if(node->next!=0 && node->pre==0)//begining of the list
{
struct node * temp1 = node->next;
temp1->pre=0;
free(node);
}
if(node->next=0 && node->pre!=0)//end of the list
{
struct node* temp2=node->pre;
temp2->next=0;
free(node);
}
}
void addNode(struct node *head)
{
struct node *current = head;
struct node *newNode = malloc(sizeof(struct node));
puts("*******Now you can insert a new person\n****");
printf("FIRSTNAME: ");
gets(newNode->FirstName);
printf("LASTNAME: ");
gets(newNode->LastName);
printf("FATHERNAME: ");
gets(newNode->FatherName);
printf("EMAIL: ");
gets(newNode->Email);
printf("SITENAME: ");
gets(newNode->SiteName);
printf("NUMBER: ");
gets(newNode->Number);
//create new node
newNode->next = 0; // Change 1
if(current->next==0)
{
current->next=newNode;
newNode->pre=current;
}
else {
while (current->next != 0)
{
current = current->next;
}
current->next = newNode;
newNode->pre=current;
}
// printf("added later\n");
}
//*************************************************************************
int main()
{
printf("please choose your option:\n");
printf("1.search\n2.add\n3.delete\n4.Sort\n5.Edit\n6.show the list\n7.Exit\n");
struct node *root;
struct node *conductor;
root = malloc( sizeof(struct node) );
root->next = 0;
// addNode(root);
// char c=getchar();
//*********************************
strcpy(root->FirstName, "root");
strcpy(root->LastName, "last");
// print(root);
addNode(root);
addNode(root);
printf("SEARCH\n");
printf("in which group you want to search?\n");
printf("1.Number\n2.FirstName\n3.LastName\n4.FatherName\n5.Email\n6.Site\n");
int num;
scanf("%d", &num);
switch(num)
{
char s[20];
case 1:
printf("please enter your Number to search!");
scanf("%s",s);
search(root,s,num);
break;
case 2:
printf("please enter your FirstName to search!\n");
scanf("%s", s);
search(root,s,num);
break;
case 3:
printf("please enter your LastName to search!\n");
scanf("%s", s);
search(root,s,num);
break;
case 4:
printf("please enter your FatherName to search!\n");
scanf("%s", s);
search(root,s,num);
break;
case 5:
printf("please enter your Email to search!\n");
scanf("%s", s);
search(root,s,num);
break;
case 6:
printf("please enter your Site to search!\n");
scanf("%s", s);
search(root,s,num);
break;
}
return 0;
}
推荐答案
Please take a look at this. This explains the delete item in a linked list.
基本上,在删除链接列表中的节点时,应考虑以下情形!
Basically you should consider the following scenarios when deleting a node in a linked list!
(1) deleting head
delete element and adjust head pointer
(2) deleting tail
delete element and adjust tail pointer
(3) one element list
if data is the data for the only element
then delete the list and set head and tail
pointers to NULL
(4) all the other cases
traverse through the list and hold the
previous pointer. delete element and adjust
the next pointers.
(5) if not the above cases, then element not
present.. do nothing..
这篇关于从链表中删除节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!