无头结点单链表删除节点函数

HMHMHT 2023-01-22 12:43:38

返回值出现了指针越界,并且最后的flag标志位的判断语句也没有执行,我想请教一下大家

void delete_list(Node *phead, int num)//前者传递链表首节点位置,后者传递要删除节点的值 
{
	
	p = phead;//遍历起始节点
	int flag = 0;//标志位判断是否有该值 
	Node *q = (Node*)  malloc (sizeof(Node));
	
	
	if(p != NULL)//空表判断 
	{
		if(p->next)//非单节点进入循环 
		{
		   while(p)// 1.首节点 2.尾结点 3.中间节点 
	      {
		      printf("*");//测试循环进入次数 
		   //尾部节点删除 前个节点的next 指向为NULL 
		      if(p->next->next == NULL)//最后一个 
		        {
		        	if(p->next->value == num) 
		           	{
					   flag = 1;
			           q = p->next;
		               p->next = NULL;
		         	   free(q);
		            }
			
		       }
		   //首节点用额外指针直接删除 
		  if(p == phead)
	    	 {
	    	 	if(p->value == num)
		        {
					flag = 1;
					q=p;
					q->next = NULL;
			        phead= phead->next; //改头 
		     	    
		    	    free(q);
		    	}
		    }
		// 中间节点1.将前驱的后继指向 删除节点的后继
		//2.删除该节点 
	    	else
		    {
				if(p->next->value == num)
		        {
				    flag = 1;
			    	q=p->next;
			    	p->next = q->next;
			    	q->next =NULL;//断链 
			    	free(q);
			    }
		    }
		
	        	p = p ->next;
	        } 
		}
		//只有一个节点 
		else
		{
			if(p->value == num)
			{
				q=p;
				free(q);
				phead =  NULL;
			}
		} 
		
	 } 

	 if(flag == 1)
	 printf("find num %d",num);
	 else
	 printf("no find",num);
} 

 

 

...全文
34 3 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 4天前
  • 打赏
  • 举报
回复

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

HMHMHT 01-22
  • 打赏
  • 举报
回复
void delete_list(Node **phead, int num)//前者传递链表首节点位置,后者传递要删除节点的值 
{
    Node *p = *phead;//遍历起始节点
    int flag = 0;//标志位判断是否有该值 
    Node *q = (Node*)  malloc (sizeof(Node));
   
   
   if(p != NULL)//空表判断 
    {
        
        if(p->next == NULL)
        {
            if(p->value == num)
            *phead =  NULL;
        } 
        else//非单节点进入循环 
        {
          while(p->next)// 1.首节点 2.尾结点 3.中间节点 (23其实同一类)
          {
            //printf("*");//测试循环进入次数 
          if(p == *phead && p->value == num)
             {
                 
                    flag = 1;
                    q=p;
                    (*phead)= (*phead)->next; //改头    
                    free(q);
                    break;
           //首节点用额外指针直接删除 
            }
        // 中间节点1.将前驱的后继指向 删除节点的后继
        //2.删除该节点 
            else
            {
                if(p->next->value == num)
                {
                    flag = 1;
                    q=p->next;
                    p->next = q->next;
                    free(q);
                    break;
                }
            }
             p = p->next;
         }//while{} 
        }

        
     } 
   
    if(flag == 1)
     printf("find num %d",num);
     else
     printf("no find",num);
} 

HMHMHT 01-22
  • 举报
回复
@HMHMHT 我自己测试过了,指针访问越界出现在 while循环条件可到尾结点,但内部会用到尾结点的后继节点,因此对while循环作出改变 另外单一节点不用释放,直接赋值NULL 最后 头结点删除会要求链表首节点指针后移 (改变了地址)因此需要传递首节点指针的指针 希望有人对该代码提出更多意见,能指导我这个初学者
相关推荐
发帖
C语言

6.7w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
帖子事件
创建了帖子
2023-01-22 12:43
社区公告
暂无公告