我有以下代码从线性单链表中删除给定节点。 我想知道我们是否仍然可以改进这个程序并随时打破
struct node
{
int num;
struct node *next;
} ;
typedef struct node s;
void delete(struct node *first)
{
int flag = 0;
s *ptr, *lastNodePtr = NULL, *deleteNode;
deleteNode = (s*) malloc(sizeof(s));
printf("enter the node value to delete");
scanf_s("%d",&deleteNode->num);
deleteNode->next = NULL;
for (ptr=first;ptr!=NULL;ptr=ptr->next) //at least one element exist
{
if(deleteNode->num == ptr->num)
{
flag=1;
if(ptr==first) //need to delete at first place
{
free(ptr);
first = null; //i dont think we need to do this as it points to ptr and ptr is already null.
}
else // need to delete some where middle.it can be last as well.
{
lastNodePtr->next=ptr->next;
free(ptr);
}
printf("successfully deleted..");
break;
}
lastNodePtr=ptr; // taking note of last node visited..
}
if (flag==0)
{
printf("\n Couldn't find the node");
return;
}
}
答案 0 :(得分:1)
如果ptr是要删除的列表中的第一个元素,则首先将其设置为null,而不是ptr的下一个元素。 (副作用:你无法释放列表的其余部分)
你的EDITH:删除应该返回新的头部,最好使它成为一个结构节点**第一个参数,如果第一个元素是删除的那个,它将改变第一个元素
BTW:永远不会施放malloc的结果。
BTW两个。为什么要使用for-loop?每个人都使用带链表的while循环 BTW三:链接列表的正常变量名称是“head”,“list”,“next”,“prev”,“last”具有良好的副作用,它们都是相同的长度,所以整齐地说对齐。答案 1 :(得分:0)
struct node
{
struct node *next;
int num;
} ;
void delete(struct node **pp, int num) {
struct node *del;
for ( ;*pp; pp= &(*pp)->next) {
if((*pp)->num == num) break;
}
if (!*pp) { printf("Couldn't find the node(%d)\n", num); return; }
del = *pp;
*pp = del->next;
free(del);
}
BTW:for()
循环没有错;它们允许您将所有循环逻辑放在一行上。