#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);
}