数据结构单链表附完整代码----单链表的基本操作

直接干货:

 

LinkList.h文件:

#pragma once

typedef int ElemType;

typedef struct LNode
{
    ElemType data;
    struct LNode* next;
}LNode, *LinkList;

void InitLinkList(LinkList* list);

LNode* _buyNode(ElemType Item);

void push_front(LinkList* list, ElemType x);

void push_back(LinkList* list, ElemType x);

void showList(LinkList* list);

void pop_back(LinkList* list);

void pop_front(LinkList* list);

int length_list(LinkList* list);

void insertLinklist_pos(LinkList* list, int pos, ElemType key);

void delete_LinkList_val(LinkList* list, ElemType x);

void sortLinkList(LinkList* list);

void reverseLinkList(LinkList* list);

int findval_val(LinkList* list, ElemType key);

int countX(LinkList* list, ElemType x);

void clearLinkList(LinkList* list);

void destroyLinkList(LinkList* list);

 

 


LinkList.c文件:

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

void InitLinkList(LinkList* list)
{
    *list = NULL;
}

LNode* _buyNode(ElemType Item)
{
    LNode* NewNode = (LNode*)malloc(sizeof(LNode));
    if (NewNode == NULL)
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    NewNode->data = Item;
    NewNode->next = NULL;
    return NewNode;
}

void push_front(LinkList* list, ElemType x)
{
    LNode* NewNode = _buyNode(x);
    NewNode->next = *list;
    *list = NewNode;
}

void push_back(LinkList* list, ElemType x)
{
    if (*list == NULL)
    {
        push_front(list, x);
        return;
    }

    LNode* p = *list;
    while (p->next != NULL)
    {
        p = p->next;
    }

    LNode* NewNode = _buyNode(x);
    p->next = NewNode;
}

void showList(LinkList* list)
{
    if (*list == NULL)
    {
        printf("The LinkList is empty.\n");
        return;
    }

    LNode* p = *list;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

void pop_back(LinkList* list)
{
    if (*list == NULL)
    {
        return;
    }

    if ((*list)->next == NULL)
    {
        free(*list);
        *list = NULL;
        return;
    }

    LNode* p = *list;
    while (p->next->next != NULL)
    {
        p = p->next;
    }

    free(p->next);
    p->next = NULL;
}

void pop_front(LinkList* list)
{
    if (*list == NULL)
    {
        return;
    }

    LNode* p = *list;
    *list = (*list)->next;
    free(p);
}

int length_list(LinkList* list)
{
    int count = 0;
    LNode* p = *list;
    while (p != NULL)
    {
        count++;
        p = p->next;
    }
    return count;
}

void insertLinklist_pos(LinkList* list, int pos, ElemType key)
{
    if (pos < 0 || pos > length_list(list))
    {
        return;
    }

    if (pos == 0)
    {
        push_front(list, key);
        return;
    }

    LNode* p = *list;
    for (int i = 0; i < pos - 1; i++)
    {
        p = p->next;
    }

    LNode* NewNode = _buyNode(key);
    NewNode->next = p->next;
    p->next = NewNode;
}

void delete_LinkList_val(LinkList* list, ElemType x)
{
    if (*list == NULL)
    {
        return;
    }

    if ((*list)->data == x)
    {
        pop_front(list);
        return;
    }

    LNode* p = *list;
    while (p->next != NULL && p->next->data != x)
    {
        p = p->next;
    }

    if (p->next != NULL)
    {
        LNode* q = p->next;
        p->next = q->next;
        free(q);
    }
}

void sortLinkList(LinkList* list)
{
    if (*list == NULL || (*list)->next == NULL)
    {
        return;
    }

    LNode* p = *list;
    LNode* q;
    ElemType temp;

    while (p != NULL)
    {
        q = p->next;
        while (q != NULL)
        {
            if (p->data > q->data)
            {
                temp = p->data;
                p->data = q->data;
                q->data = temp;
            }
            q = q->next;
        }
        p = p->next;
    }
}

void reverseLinkList(LinkList* list)
{
    if (*list == NULL || (*list)->next == NULL)
    {
        return;
    }

    LNode* prev = NULL;
    LNode* current = *list;
    LNode* next;

    while (current != NULL)
    {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }

    *list = prev;
}

int findval_val(LinkList* list, ElemType key)
{
    int index = 0;
    LNode* p = *list;
    while (p != NULL && p->data != key)
    {
        p = p->next;
        index++;
    }

    if (p == NULL)
    {
        return -1;
    }

    return index;
}

int countX(LinkList* list, ElemType x)
{
    int count = 0;
    LNode* p = *list;
    while (p != NULL)
    {
        if (p->data == x)
        {
            count++;
        }
        p = p->next;
    }
    return count;
}

void clearLinkList(LinkList* list)
{
    LNode* p = *list;
    while (p != NULL)
    {
        LNode* temp = p;
        p = p->next;
        free(temp);
    }
    *list = NULL;
}

void destroyLinkList(LinkList* list)
{
    clearLinkList(list);
}
LinkList.h文件:

#pragma once

typedef int ElemType;

typedef struct LNode
{
    ElemType data;
    struct LNode* next;
}LNode, *LinkList;

void InitLinkList(LinkList* list); // 初始化链表

LNode* _buyNode(ElemType Item); // 创建新结点

void push_front(LinkList* list, ElemType x); // 头插法插入结点

void push_back(LinkList* list, ElemType x); // 尾插法插入结点

void showList(LinkList* list); // 输出链表元素

void pop_back(LinkList* list); // 删除尾部结点

void pop_front(LinkList* list); // 删除头部结点

int length_list(LinkList* list); // 返回链表长度

void insertLinklist_pos(LinkList* list, int pos, ElemType key); // 在指定位置插入结点

void delete_LinkList_val(LinkList* list, ElemType x); // 删除指定元素的结点

void sortLinkList(LinkList* list); // 对链表进行排序

void reverseLinkList(LinkList* list); // 反转链表

int findval_val(LinkList* list, ElemType key);// 查找指定元素的位置

int countX(LinkList* list, ElemType x); // 统计指定元素出现的次数

void clearLinkList(LinkList* list); // 清空链表

void destroyLinkList(LinkList* list); // 销毁链表

LinkList.c文件:

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

void InitLinkList(LinkList* list)
{
    *list = NULL;
}

LNode* _buyNode(ElemType Item)
{
    LNode* NewNode = (LNode*)malloc(sizeof(LNode));
    if (NewNode == NULL)
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    NewNode->data = Item;
    NewNode->next = NULL;
    return NewNode;
}

void push_front(LinkList* list, ElemType x)
{
    LNode* NewNode = _buyNode(x);
    NewNode->next = *list;
    *list = NewNode;
}

void push_back(LinkList* list, ElemType x)
{
    if (*list == NULL)
    {
        push_front(list, x);
        return;
    }

    LNode* p = *list;
    while (p->next != NULL)
    {
        p = p->next;
    }

    LNode* NewNode = _buyNode(x);
    p->next = NewNode;
}

void showList(LinkList* list)
{
    if (*list == NULL)
    {
        printf("The LinkList is empty.\n");
        return;
    }

    LNode* p = *list;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

void pop_back(LinkList* list)
{
    if (*list == NULL)
    {
        return;
    }

    if ((*list)->next == NULL)
    {
        free(*list);
        *list = NULL;
        return;
    }

    LNode* p = *list;
    while (p->next->next != NULL)
    {
        p = p->next;
    }

    free(p->next);
    p->next = NULL;
}

void pop_front(LinkList* list)
{
    if (*list == NULL)
    {
        return;
    }

    LNode* p = *list;
    *list = (*list)->next;
    free(p);
}

int length_list(LinkList* list)
{
    int count = 0;
    LNode* p = *list;
    while (p != NULL)
    {
        count++;
        p = p->next;
    }
    return count;
}

void insertLinklist_pos(LinkList* list, int pos, ElemType key)
{
    if (pos < 0 || pos > length_list(list))
    {
        return;
    }

    if (pos == 0)
    {
        push_front(list, key);
        return;
    }

    LNode* p = *list;
    for (int i = 0; i < pos - 1; i++)
    {
        p = p->next;
    }

    LNode* NewNode = _buyNode(key);
    NewNode->next = p->next;
    p->next = NewNode;
}

void delete_LinkList_val(LinkList* list, ElemType x)
{
    if (*list == NULL)
    {
        return;
    }

    if ((*list)->data == x)
    {
        pop_front(list);
        return;
    }

    LNode* p = *list;
    while (p->next != NULL && p->next->data != x)
    {
        p = p->next;
    }

    if (p->next != NULL)
    {
        LNode* q = p->next;
        p->next = q->next;
        free(q);
    }
}

void sortLinkList(LinkList* list)
{
    if (*list == NULL || (*list)->next == NULL)
    {
        return;
    }

    LNode* p = *list;
    LNode* q;
    ElemType temp;

    while (p != NULL)
    {
        q = p->next;
        while (q != NULL)
        {
            if (p->data > q->data)
            {
                temp = p->data;
                p->data = q->data;
                q->data = temp;
            }
            q = q->next;
        }
        p = p->next;
    }
}

void reverseLinkList(LinkList* list)
{
    if (*list == NULL || (*list)->next == NULL)
    {
        return;
    }

    LNode* prev = NULL;
    LNode* current = *list;
    LNode* next;

    while (current != NULL)
    {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }

    *list = prev;
}

int findval_val(LinkList* list, ElemType key)
{
    int index = 0;
    LNode* p = *list;
    while (p != NULL && p->data != key)
    {
        p = p->next;
        index++;
    }

    if (p == NULL)
    {
        return -1;
    }

    return index;
}

int countX(LinkList* list, ElemType x)
{
    int count = 0;
    LNode* p = *list;
    while (p != NULL)
    {
        if (p->data == x)
        {
            count++;
        }
        p = p->next;
    }
    return count;
}

void clearLinkList(LinkList* list)
{
    LNode* p = *list;
    while (p != NULL)
    {
        LNode* temp = p;
        p = p->next;
        free(temp);
    }
    *list = NULL;
}

void destroyLinkList(LinkList* list)
{
    clearLinkList(list);
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1. 定义单链表结构体和节点结构体 ```c typedef struct ListNode { int data; struct ListNode *next; } ListNode; typedef struct LinkedList { ListNode *head; int length; } LinkedList; ``` 2. 创建一个空链表 ```c LinkedList *createLinkedList() { LinkedList *list = (LinkedList *)malloc(sizeof(LinkedList)); list->head = NULL; list->length = 0; return list; } ``` 3. 在链表尾部插入一个节点 ```c void insertAtTail(LinkedList *list, int data) { ListNode *newNode = (ListNode *)malloc(sizeof(ListNode)); newNode->data = data; newNode->next = NULL; if (list->head == NULL) { list->head = newNode; } else { ListNode *tail = list->head; while (tail->next != NULL) { tail = tail->next; } tail->next = newNode; } list->length++; } ``` 4. 在链表头部插入一个节点 ```c void insertAtHead(LinkedList *list, int data) { ListNode *newNode = (ListNode *)malloc(sizeof(ListNode)); newNode->data = data; newNode->next = list->head; list->head = newNode; list->length++; } ``` 5. 在链表中间插入一个节点 ```c void insertAtIndex(LinkedList *list, int index, int data) { if (index < 0 || index > list->length) { printf("Error: index out of range.\n"); return; } if (index == 0) { insertAtHead(list, data); return; } if (index == list->length) { insertAtTail(list, data); return; } ListNode *newNode = (ListNode *)malloc(sizeof(ListNode)); newNode->data = data; ListNode *prev = list->head; for (int i = 0; i < index - 1; i++) { prev = prev->next; } newNode->next = prev->next; prev->next = newNode; list->length++; } ``` 6. 获取链表中指定位置的节点值 ```c int get(LinkedList *list, int index) { if (index < 0 || index >= list->length) { printf("Error: index out of range.\n"); return -1; } ListNode *current = list->head; for (int i = 0; i < index; i++) { current = current->next; } return current->data; } ``` 7. 修改链表中指定位置的节点值 ```c void set(LinkedList *list, int index, int data) { if (index < 0 || index >= list->length) { printf("Error: index out of range.\n"); return; } ListNode *current = list->head; for (int i = 0; i < index; i++) { current = current->next; } current->data = data; } ``` 8. 删除链表中指定位置的节点 ```c void deleteAtIndex(LinkedList *list, int index) { if (index < 0 || index >= list->length) { printf("Error: index out of range.\n"); return; } ListNode *deletedNode = NULL; if (index == 0) { deletedNode = list->head; list->head = list->head->next; } else { ListNode *prev = list->head; for (int i = 0; i < index - 1; i++) { prev = prev->next; } deletedNode = prev->next; prev->next = deletedNode->next; } free(deletedNode); list->length--; } ``` 9. 判断链表是否为空 ```c bool isEmpty(LinkedList *list) { return list->head == NULL; } ``` 10. 获取链表的长度 ```c int length(LinkedList *list) { return list->length; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善程序员文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值