单链表删除头结点时出错解决方法

 
#include<stdio.h>
#include<stdlib.h> 
typedef struct node{
	struct node *next;
	int age;
}Node;
Node *CreatList(){
Node *head = NULL;
Node *p,*t;          
int a ;
    printf("请输入数据(输入0结束)\n");
    while(scanf("%d",&a)){
        if(a!=0){
            t=(Node *)malloc(sizeof(Node));
            t->age=a;
            if(head==NULL){
                head=t;    
            }
            else{
                p->next=t;
            }
               p=t;
        }   
        else{    
            p->next=NULL;     //一定要有此部分结束,否则传值无底线
            break; 
        }
    }
    return head;
}
void  print(Node *head){
    	Node *p = head;
	while(p!=NULL){
  		printf("%d ",p->age);
   		p = p->next;
    }
}

/*
Node *delete_tree(Node *head){
        Node *s;
    if(head!=NULL&&a==head->age){   
         s = head;                 
         head = (*head)->next;
         free(s);
    }
}
把head节点free了,然后又改变了head节点地址。
因为del函数的第一个参数head不是node **类型,所以,
del函数返回后,head有变成调用前的地址,而这个地址已经被free了,所以出错。
一般情况为了简化代码,提高效率,
链表的头结点一般不存数据,在删除结点的操作中也永远都不会被删掉。
采用这种思路的话,也就不存在你这个问题了*/
Node *delete_tree(Node **head){
	printf("\n");
	printf("请输入你要删除的一个数:\n");
	int a;
	scanf("%d",&a);
	Node *s;
	Node *ss; 
    if(head!=NULL&&a==(*head)->age){  //头结点的删除要当删除时要记得删除相应的头结点位置  
        s = (*head);                //或者直接采取头结点不要存储任何东西(即带头结点)
        (*head) = (*head)->next;
        free(s);         
    }
    else{
		s = (*head);
		ss = (*head)->next;
	while(ss){
        if(a==ss->age){ 
		    s->next = ss->next;
			free(ss);
   		break;
	}
	   else{
    		s = ss;
			ss = s->next;
   		}
      }
    }
      return *head ;
}

/*node *free(Node *head){
 
Node *s  = head;
while(s){
free(s);
s = s->next; 
}
return head;
}*/
 
int main(){
  	Node *p;
	p = CreatList();
	print(p);
    delete_tree(&p);
    print(p);
    //free(p);
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值