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

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


概念

单链表:

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


1.头文件

#include<stdio.h>
#include<stdlib.h>
#include <assert.h>

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("查找的结果是%d\n", LinkListFind(list, x));
        }
        else if(x == 5)
        {
            scanf("%d", &x);
            RemoveLinkListNode(list, x);
        }
        PrintLinkList(list);
    }

    DeleteLinkList(list);

    return 0;
}

3.注意

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值