单向链表(链式存储)

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处 https://blog.csdn.net/qq_21231413/article/details/89467730

1、定义链表节点以及表头数据结构

typedef struct ListNode{
    struct ListNode* next;
}ListNode_t;
typedef struct LinkList{
    ListNode_t header; //头结点
    int length; //链表长度
}LinkList_t;

2、链表的初始化

LinkList_t * LinkListInit()
{
    LinkList_t * list = (LinkList_t*)malloc(sizeof(LinkList_t));
    if (list == NULL){
        return NULL;
    }
    list->header.next = NULL;
    list->length = 0;
    return list;
}

3、指定位置插入链表节点

int LinkListInsert(LinkList_t* list, int pos, ListNode_t* node)
{
    ListNode_t* current = &(list->header);

    //如果 pos 位置超出链表长度,那么就插入到最后一个位置
    if (pos > list->length) pos = list->length;

    //找到插入的位置
    for (int i = 0; i < pos; i ++){
        current = current->next;
    }

    //新节点插入到 pos 位置
    node->next = current->next;
    current->next = node;
    list->length++;
    return 0;
}

4、删除指定位置链表节点

int LinkListDelete(LinkList_t* list, int pos)
{
    if (pos > list->length-1){
        printf("删除位置%d 不合法!\n",pos);
        return -1;
    }
    ListNode_t* current = &(list->header);

    //找到要删除的位置
    for (int i = 0; i < pos; i++){
        current = current->next;
    }

    //要删除的结点
    ListNode_t* delNode = current->next;

    //删除结点
    current->next = delNode->next;
    list->length--;
    return 0;
}

5、判断链表是否为空

int IsEmptyLinkList(LinkList_t* list)
{
    if (list->length == 0){
        return 1;
    }
    return 0;
}

6、获取链表的节点数

int GetLengthLinkList(LinkList_t* list){
    return list->length;
}

7.清空链表

void ClearLinkList(LinkList_t* list){
    list->header.next = NULL;
    list->length = 0;
}

8、销毁链表

void DestroyLinkList(LinkList_t* list)
{
    if (NULL != list){
        list->header.next = NULL;
        list->length = 0;
        free(list);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_21231413/article/details/89467730