C语言链表初试(输出链表中的数、删除某个数)

这篇博客探讨了C语言中链表的基本操作,包括如何输出链表中的元素以及如何删除特定元素。作者分享了自己对手写链表代码的理解,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

主体代码

#include<stdio.h>
#include<stdlib.h>

typedef struct _node{
    int value;
    struct _node *pointer; 
}node;

typedef struct _package{
    node *head;
}package;

void linked_list(package *package); //创造链表 
void print_linkedlist(package *package);  //输出链表中的每个元素 
void del_an_unit(package *package);  // 删除列表中的某个元素 

int main(){
    package package = {NULL};

    linked_list(&package);

    print_linkedlist(&package);

    del_an_unit(&package);

    print_linkedlist(&package); 

    return 0;
}

void linked_list(package *package){

    int n;
    scanf("%d",&n);
    while(n>=0){
        node *p = (node*)malloc(sizeof(node));
        p->value = n;
        p->pointer = NULL;

        if(package->head  == NULL)
        //这句判断保证了初始化时赋值给package->head的p,一定是第一个产生的p。
        //因为如果是第二次的话,package->head已经不是NULL了。
        {
            package->head = p;
        }else{
            node *next = package->head;
            while(next->pointer != NULL){
                next = next->pointer;
            }
            next->pointer = p;
        }

        scanf("%d",&n);
    }
}

void print_linkedlist(package *package){
    node *temp;

    for(temp=package->head;temp;temp=temp->pointer){
        printf("%d\t",temp->value);
    }
    printf("\n");
}

void del_an_unit(package *package){

    int n = -1;
    int sign = 0;
    printf("请输入想从链表中删除的一个数据\n");
    do{
        node *temp = package->head;

        scanf("%d",&n);
        for(temp=package->head;temp;temp=temp->pointer){
            //必须有一个指针跟在temp屁股后面 
            node *follow = package->head;
            while(follow->pointer != temp && follow != temp ){
                follow = follow->pointer;
            }
            if(temp->value == n){
                //当被删除的数据是首位时,就要把head往后移动一个单元。否则package->pointer被释放之后
                // (package->head)->pointer是个啥呢? (package->head)都不存在了。 
                if(temp == package->head){
                    package->head = temp->pointer;
                    free(temp);
                    temp = package->head;
                }else{
                    follow->pointer = temp->pointer; 
                    //当temp要被释放的时候,使本来前一位指向temp跳过temp,即指向temp->pointer 
                    free(temp); 
                    temp = follow;
                    //然后让temp=follow重新接上来               
                }

                sign = 1;
            }
        }
        if(n != -1){            
            if(sign){
                printf("该数据已经删除,请输入另一个想要删除的数,或者输入-1结束。\n");
            }else{
                printf("列表中并无改数据,请输入另一个想删除的数。或者输入-1结束。\n");
            }
        }
    }while(n!=-1);
}

对于链表生成,我的一些理解

警告:以下为手写稿!

链表1

链表2
——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值