单向链表的C语言实现

单向链表的C语言实现

头文件

#ifndef MYLINKLIST_H_INCLUDED
#define MYLINKLIST_H_INCLUDED
#include <stdint.h>
#include <stdbool.h>

typedef struct my_linklist{
    int value;
    struct my_linklist *Next;
}my_linklist_t;

my_linklist_t *CreatLinklist(uint16_t len);
void DeleteLinklist(my_linklist_t *p);
bool LinklistNodeExists(my_linklist_t *linklist,my_linklist_t *Node);
void appendNodeToLinklist(my_linklist_t *linklist,my_linklist_t *Node);
void deleteLinklistNode(my_linklist_t *linklist,my_linklist_t *Node);

void outputLinklist(my_linklist_t *linklist);
uint32_t getLinklistSize(my_linklist_t *linklist);
int32_t getNodePosition(my_linklist_t *linklist,my_linklist_t *Node);



#endif // MYLINKLIST_H_INCLUDED

C文件

#include "mylinklist.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define __FOR_TEST_USE__

my_linklist_t *CreatLinklist(uint16_t len)
{
    my_linklist_t *p =(my_linklist_t *)malloc(sizeof(my_linklist_t));
    if(NULL == p)
    {
#ifdef __FOR_TEST_USE__
        printf("Creat linklist failed,no enough memory.\r\n");
#endif // __FOR_TEST_USE__
    }
    else
    {
        p->Next=NULL;
    }
    return p;
}
void DeleteLinklist(my_linklist_t *p)
{
    free(p);
}
bool LinklistNodeExists(my_linklist_t *linklist,my_linklist_t *Node)
{
    my_linklist_t *tmp=linklist;
    bool isFindNode=false;
    while(tmp != NULL)
    {
        if(tmp->Next == Node)
        {
             isFindNode = true;
             goto FUNCTION_END;
        }
        else
        {
            tmp=tmp->Next;
        }
    }
FUNCTION_END:
    return isFindNode;
}
void appendNodeToLinklist(my_linklist_t *linklist,my_linklist_t *Node)
{
    my_linklist_t *tmp=linklist;
    while(tmp->Next != NULL)
    {
        tmp=tmp->Next;
    }
    tmp->Next=Node;
    Node->Next=NULL;
}
void deleteLinklistNode(my_linklist_t *linklist,my_linklist_t *Node)
{
     my_linklist_t *tmp=linklist;
    if((!LinklistNodeExists(linklist,Node))||(tmp->Next == NULL))
    {
#ifdef __FOR_TEST_USE__
        printf("Error:node is not in the Linklist.\r\n");
#endif // __FOR_TEST_USE__
        return;
    }
    while(tmp!=NULL)
    {
        if(tmp->Next == Node)
        {
            break;
        }
        tmp=tmp->Next;
    }
    tmp->Next=Node->Next;
}

void outputLinklist(my_linklist_t *linklist)
{
    my_linklist_t *tmp=linklist->Next;
    while(tmp !=NULL)
    {
        printf("%d\r\n",tmp->value);
        tmp=tmp->Next;
    }
}
uint32_t getLinklistSize(my_linklist_t *linklist)
{
     my_linklist_t *tmp=linklist->Next;
     uint32_t i=0;
     while(tmp !=NULL)
    {
        i++;
        tmp=tmp->Next;
    }
    return i;
}

int32_t getNodePosition(my_linklist_t *linklist,my_linklist_t *Node)
{
    uint32_t pos=0;
    my_linklist_t *tmp=linklist->Next;
    if((!LinklistNodeExists(linklist,Node))||(tmp->Next == NULL))
    {
#ifdef __FOR_TEST_USE__
         printf("Error:node is not in the Linklist.\r\n");
        return -1;
#endif // __FOR_TEST_USE__
    }
    while(tmp !=NULL)
    {
        if(tmp!=Node)
            pos++;
        else
            break;
        tmp=tmp->Next;

    }
    return pos;
}

测试程序

#include <stdio.h>
#include <stdlib.h>
#include "mylinklist.h"
int main()
{
    my_linklist_t *list1=CreatLinklist(1);
    if(list1!=NULL)
    {
        printf("Creat Linklist Successfully.\r\n");
    }
    my_linklist_t Node1,Node2,Node3,Node4;
    Node1.value=100;
    Node2.value=200;
    Node3.value=300;

    printf("&Node1= %#x\r\n",(uint32_t)&Node1);
    printf("&Node2= %#x\r\n",(uint32_t)&Node2);
    printf("&Node3= %#x\r\n",(uint32_t)&Node3);

    appendNodeToLinklist(list1,&Node1);
    appendNodeToLinklist(list1,&Node2);
    appendNodeToLinklist(list1,&Node3);
    printf("Before:\r\n");
    printf("list1 size = %d \r\n",getLinklistSize(list1));
    outputLinklist(list1);

        printf("=================================\r\n");
    printf("Node pos= %d\r\n",getNodePosition(list1,&Node1));

    deleteLinklistNode(list1,&Node4);
    deleteLinklistNode(list1,&Node2);
    printf("After:\r\n");
    printf("list1 size = %d \r\n",getLinklistSize(list1));
    outputLinklist(list1);


    DeleteLinklist(list1);
    return 0;
}

运行结果
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值