栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构——线性单链表c代码实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构——线性单链表c代码实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 概念
    • 1.头文件
    • 2.源文件
    • 3.注意


概念

单链表:

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。


1.头文件
#include
#include
#include 

typedef struct Node
{   
    int data;           //数据域
    struct Node *next;  //指针域
} node;


typedef struct LinkList
{
    node * head;  //虚拟头结点
    node * tail;  //尾结点
    int size;     //链表的大小
} link_list;

//新建数据节点
node * GetNewNode(int val);

//初始化一个空的链表
link_list * InitLinkList();

//向链表中插入数据(尾插法)
int LinkListPushBack(link_list * list, int x);

//向链表中插入数据(头插法)
int LinkListPushFront(link_list * list, int x);

//从链表中删除数据(尾删法)
int LinkListPopBack(link_list * list);

//从链表中删除数据(头删法)
int LinkListPopFront(link_list * list);

//删除指定值的结点(第一个出现)
int RemoveLinkListNode(link_list * list, int x);

//查找链表中的数据
int LinkListFind(link_list * list, int x);

//打印链表
void PrintLinkList(link_list * list);

//删除链表
void DeleteLinkList(link_list * list);
2.源文件

代码如下(示例):

#include "link_list.h"

//新建数据节点
node *GetNewNode(int val)
{
    node *newNode = (node *)malloc(sizeof(node));
    newNode->data = val;
    newNode->next = NULL;
    return newNode;
}

//初始化空的链表
link_list *InitLinkList()
{
    link_list *list = (link_list *)malloc(sizeof(link_list));
    list->head = list->tail = GetNewNode(0); //初始化头尾是同一个结点
    list->head->next = NULL;
    list->size = 0;
    return list;
}

//向链表中插入数据(尾插法)
int LinkListPushBack(link_list *list, int x)
{
    assert(list != NULL);
    node *newNode = GetNewNode(x);
    list->tail->next = newNode; //将新结点连接到尾结点的下一个结点
    list->tail = newNode;       //将尾结点指向新结点
    list->size++;
    return 0;
}

//向链表中插入数据(头插法)
int LinkListPushFront(link_list *list, int x)
{
    assert(list != NULL);
    node *newNode = GetNewNode(x);
    newNode->next = list->head->next; //将新结点连接到虚拟头结点的下一个结点
    list->head->next = newNode;       //将尾结点指向新结点
    if (list->size == 0)
    {
        list->tail = newNode;
    }
    list->size++;
    return 0;
}

//从链表中删除数据(尾删法)
int LinkListPopBack(link_list *list)
{
    assert(list != NULL);
    if (list->size == 0)
    {
        printf("链表为空,无法删除n");
        return -1;
    }
    node *p = list->head;
    while (p->next != list->tail)
    {
        p = p->next;
    }
    free(list->tail);
    list->tail = p;
    list->tail->next = NULL;
    list->size--;
    return 0;
}

//从链表中删除数据(头删法)
int LinkListPopFront(link_list *list)
{
    assert(list != NULL);
    if (list->size == 0)
    {
        printf("链表为空,无法删除n");
        return -1;
    }
    node *temp = list->head->next;
    list->head->next = temp->next;
    free(temp);
    if (list->size == 1)
    {
        list->tail = list->head;
    }
    list->size--;
    return 0;
}

//删除指定值的结点(第一个出现)
int RemoveLinkListNode(link_list * list, int x)
{
    assert(list != NULL);
    if(list->size == 0){
        printf("链表为空,无法删除n");
        return -1;
    }
    node * p = list->head->next;
    node * q = list->head;
    while (p->data != x)
    {
        q = p;
        p = q->next;
        if(p == NULL){
            printf("没有找到指定值的结点n");
            return -1;
        }
    }
    q->next = p->next;
    list->size--;
    return 0;
}

//查找链表的数据
int LinkListFind(link_list *list, int x)
{
    assert(list != NULL);
    node *p = list->head->next;
    while (p != NULL && p->data != x)
    {
        p = p->next;
    }
    return p != NULL ? p->data : -1;
}

//打印链表
void PrintLinkList(link_list *list)
{
    assert(list != NULL);
    printf("----------size: %d------------n", list->size);
    node *temp = list->head->next;
    while (temp != NULL)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("n---------------------------n");
}

//删除链表
void DeleteLinkList(link_list *list)
{
    assert(list != NULL);
    node *p = list->head->next;
    node *q = NULL;
    while (p != list->tail)
    {
        q = p->next;
        free(p);
        p = q;
    }
    free(list->head);
    free(list->tail);
    list->head = NULL;
    list->tail = NULL;
    free(list);
}

int main()
{
    link_list *list = InitLinkList();
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        int x;
        scanf("%d", &x);
        if (x == 0)
        {
            scanf("%d", &x);
            LinkListPushBack(list, x);
        }
        else if (x == 1)
        {
            scanf("%d", &x);
            LinkListPushFront(list, x);
        }
        else if (x == 2)
        {
            LinkListPopBack(list);
        }
        else if (x == 3)
        {
            LinkListPopFront(list);
        }
        else if (x == 4)
        {
            scanf("%d", &x);
            printf("查找的结果是%dn", LinkListFind(list, x));
        }
        else if(x == 5)
        {
            scanf("%d", &x);
            RemoveLinkListNode(list, x);
        }
        PrintLinkList(list);
    }

    DeleteLinkList(list);

    return 0;
}

3.注意

1.博客中标注原创的文章,版权归作者所有;
2.未经作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976645.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号