c语言 链表删除节点

2024-12-03 15:51:53
推荐回答(5个)
回答1:

刚学C语言呢,就是看不出来这个问题,其实问题很简单,就是你在C语言的函数里面传入了一个值,是的它是一个值,你看到的你传了一个指针进去,其实这个指针本身也是一个值,链表的头结点是个指针,你要改变这个指针就要用指针的指针才能改变,指针变量也是一个变量,你传入一个指针他也只是在函数的作用域里面过了一份拷贝!看程序!

/*你想改变a的值,所以你传了一个指针进去*/
void change(int *a)
{
    *a = 10;
}
int main()
{
    int a = 0;
    change(&a);
}

这里要说的是其实,指针也是一个变量;所以你想改变一个指针的值,同样的你也要把这个指针的地址传进去,就是指针的指针了,看代码!

void changePtr(int* *a)
{
    *a = (int*)malloc(sizeof(int));
}
int main()
{
    int a = 10,*p = &a;
    changePtr(&p);
}

上面的两个代码我也没测!就是举个例子!

看下面的代码!就是你这个链表的!或者直接打开下面网址(包含下面代码输出结果)

http://codepad.org/uQU3iHr2

#define size 5
#define del1 "one"
#define del5 "five"
#define del "none"
#define del3 "three"
typedef struct VIDEO {
    char name[20];
    struct VIDEO *next;
} video;
/*video *head;*/
void build(video**head) {
    int i = 0;
    video *temp;
    char *ss[5] = {"one","two","three","four","five"};
    temp = *head = NULL;
    for(i = 0;i < size;i++) {
        if(*head) {
            temp->next = (video*)malloc(sizeof(video));
            temp = temp->next;
            /*scanf("%s",temp->name);*/
            strcpy(temp->name,ss[i]);
            temp->next = NULL;
        } else {
            *head = (video*)malloc(sizeof(video));
            /*scanf("%s",head->name);*/
            strcpy((*head)->name,ss[i]);
            (*head)->next = NULL;
            temp = *head;
        }
    }
}
int delete(video**head,char *str) {
    video *cur,*prv = *head;
    if(*head == NULL) return 0;
    if(strcmp((*head)->name,str) == 0) {
        *head = (*head)->next;
        free(prv);
        return 1;
    }
    cur = prv->next;
    while(cur && strcmp(cur,str)) {
        cur = cur->next;
        prv = prv->next;
    }
    if(cur) {
        prv->next = cur->next;
        free(cur);
        return 1;
    } else {
        return 0;
    }
}
void show(video *head) {
    if(head) {
        printf("%s",head->name);
        while(head->next) {
            head = head->next;
            printf("->%s",head->name);
        }
        printf("\n");
    }
}
int main()
{
    video *head;
    build(&head);
    show(head);
    delete(&head,del1);
    show(head);
    delete(&head,del5);
    show(head);
    delete(&head,del);
    show(head);
    delete(&head,del3);
    show(head);
    return 0;
}

 输出结果为:

one->two->three->four->five
two->three->four->five
two->three->four
two->three->four
two->four

回答2:

很显然,删除头结点后,这个链表在主函数中就找不到了,你说呢?
建议的方式是,要是头结点是你要删除的那个节点,在主函数中做
其他的节点,在子函数中做
要是非要都在子函数中做的话,那么子函数不能使void型,需要有返回的头结点
也可以用&的操作,把头结点传递过去

回答3:

struct VIDEO *del(struct VIDEO * head)  /*要返回头指针亲测可用*/



 struct VIDEO *p,*q; char name[20]; 

 q=head; 

 printf("\n请输入你要删除的录像名称:\n"); 

 scanf("%s",name);  

 if(strcmp(head->name,name)==0) 

 head=head->next; 

  else

   {  

   for(p=q,q=q->next;q != NULL;q=q->next,p=p->next)  

   if(strcmp(q->name,name)==0) 

    {

     p->next=q->next;/*这里要删除找到的结点*/

     printf("删除成功!\n");

     break; 

    }

    //if(p != NULL)   下面这四行不需要

    // {  

    // p->next=q->next;  

    // free(q); 

    // } 

    else  

    printf("没有找到你要删除的录像\n"); 

   }

 return head;

}

回答4:

你把name[20]改为name1[20],后面的name相对应的应也改,看看。
你把name[20]改为name1[20],后面的name1相对应的应也改,看看。

回答5:

你传递head是一个指针,但head=q->next更改的也是head的值,并不是更改head指向的值。