链表基础(c)

链表

链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

链表是有一个个节点连接在一起组成的链表首先就是创建节点

//链表节点的创建
struct LinkNode
{
    int data;//数据域
    struct LinkNode *next;//指针域
};

链表初始化  (初始化头结点,头结点十分重要)

struct LinkNode *Init_LinkNode()
{
    struct LinkNode * header = (struct LinkNode *)malloc(sizeof(struct LinkNode));//创建头结点 在堆区分配相应的大小;
    header->data = -1;//头结点的数据域一般置为-1
    header->next = NULL;//指针域初始化
    
    struct LinkNode *pRear = header;//定义一个对位指针指向头结点便于数据的插入
    int var = -1;//定义一个var变量用于接收需要插入链表的数据

    while(1)
    {
        printf("please input value\n");//提示输入数值
        scanf("%d",&var);//输入要插入链表的数据 -1 输入结束
    
           if( -1 == var )
           {
                printf("insert end!\n");
                break;
           }
           //创建新的结点将收到的数据插入链表
           struct LinkNode *newNode = (struct LinkNode *) = malloc(sizeof(struct LinNode));
           newNode->data = var;//将收到的数据插入到新创建的数据里面
           newNode->next = NULL;//新创建的结点的指针域置为NULL

           //新结点创建成功后,将结点插入到链表中去;
           pRear->next = newNode;//创建的结点放在pRear结点的next
           pRear = newNode;//让pRear一直指向链表的最后一个结点
    }

}

遍历节点输出打印每一个值

void Foreach_LinkList(struct LinkNode *header)
{
    //判断头结点是否为空
    if(NULL == header) 
    {
        return;
    }
    struct LinkNode *pCurrent = header->next;//定义一个指针指向链表,便于遍历整个链表
    
    while(pCurrent != NULL)
    {
        printf("%d\n",pCurrent->data);//输出对应节点的数据域值
        pCurrent = pCurrent->next;//让指针指向下一个节点
    }

}

清除链表的每一个节点

void clear_LinkList(struct LinkNode *header)
{
    if(NULL == header)
    {
        return;
    }
    struct LinkNode *pCurrent = header->next;//定义一个节点用于指向要删除的节点的下一个节点
    while(pCurrent != NULL)
    {
        struct LinkNode *pNext = pCurrent->next;//要释放pCurrent需要一个指针指向pCurrent的下一个节点
        free(pCurrent);//释放节点
        pCurrent = pNext;//让指针指向下一个要释放的节点
    }
    printf("free list over\n");//释放所有节点成功 打印输出提示
    return;
}

插入新节点在某个节点后面

void InsertByValue_LinkList(struct LinkNode *header,int oldval,int newval)
{
    //判断是否为空节点
    if(NULL == header)
    {
        return ;
    }
    struct LinkNode *pPrev = header;
    struct LinkNode *pCurrent = pPrev ->next;
    //循环找到要插入节点的位置
    while(pCurrent != NULL) 
    {
        if(pCurrent->data == oldval)//找到了  跳出循环
        {
            pPrev = pCurrent;
            pCurrent = pCurrent->next;
            break;
        }    
        pPrev = pCurrnt;            //未找到,指针后移动
        pCurrent = pCurrent->next;
    }

    if(pCurrent == NULL )
    {
        printf("未找到值为%d的节点\n",oldval);
        return ;    
    }

    struct LinkNode *newNode = (struct LinkNode *)malloc(sizoeof(struct LinkNode));//为插入的新节分配内存
    newnode->data = newval;
    newnode->next = NULL;
    
    //将新的节点插入到固定节点后面
    newNode->next = pCurrent;
    newNode->next = newNode;
    return ;
    
}

删除某个节点

//思想 :遍历整个链表 删除相应值的节点
void RemoveByValue_LinkList(struct LinkNode *header,int deval)
{
    struct LinkNode *pRrev = header;
    struct LinkNode *pCurrent = pPrev->next;
    
    while(pCurrent != NULL)
    {
        if(pCurrent->data == deval)
        {
            break;
        }
        
        pPrev = pCurrent;
        pCurrent = pCurrent->next;
    }
    if(NULL == pCurrent)
    {
        printf("没有找到要删除的节点\n");
        return ;    
    }
    pPrev->next = pCurrent->next;
    free(pCurrent);
    printf("删除成功\n");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值