【C语言】用C语言实现单链表的所有操作

建立源文件List.cpp

#include"List.h"
int main()
{
    Test();
    system("pause");
    return 0;
}

建立头文件List.h

#ifndef __LIST_H__
#define __LIST_H__

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

typedef int DataType;

typedef struct ListNode
{
    DataType data;
    struct ListNode* next;
}ListNode;

//创建节点
ListNode* _BuyNode(DataType x)
{
    ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
    tmp->data = x;
    tmp->next = NULL;
    return tmp;
}

//尾插
void PushBack(ListNode* & head, DataType x)
{
    //0节点       不为0节点
    /*assert(head);*/
    if (head == NULL)
    {
        head = _BuyNode(x);
        head->next = NULL;
    }
    else
    {
        ListNode* newNode = _BuyNode(x);
        ListNode* cur = head;
        while (cur->next)
        {
            cur = cur->next;
        }
        ListNode* tail = cur;
        tail->next = newNode;
        tail = newNode;
        tail->next = NULL;
    }
}

//尾删
void PopBack(ListNode* & head)
{
    //0节点、1节点、多节点
    if (head == NULL)
    {
        return;
    }
    ListNode* cur = head;
    while (cur)
    {    
        if (cur->next == NULL)    //1节点情况
        {
            delete cur;
            cur = NULL;
            head = NULL;
        }
        else
        {
            ListNode* next = cur->next;
            if (next->next == NULL)
            {
                ListNode* tail = next;
                free(tail);
                tail = NULL;
                tail = cur;
                tail->next = NULL;
                break;
            }
            cur = cur->next;
        }    
    }
}

//头插
void PushFront(ListNode* & head, DataType x)
{
    //0节点  1节点、多节点
    if (head == NULL)    //0节点
    {
        PushBack(head,x);
    }
    else
    {
        ListNode* cur = head;                    
        ListNode* newNode = _BuyNode(x);
        newNode->next = head;
        head = newNode;            
    }
}

//头删
void PopFront(ListNode* & head)
{
    //0节点  1节点    多节点
    if (head == NULL)    //0节点
    {
        PopBack(head);
    }
    else if ((head != NULL) && (head->next == NULL))
    {
        free(head);
        head = NULL;
    }
    else
    {
        ListNode* del = head;
        ListNode* cur = head->next;
        head = cur;
        free (del);
        del = NULL;
    }
}

//删除节点
void Erase(ListNode* & head, ListNode* pos)
{
    assert(pos);
    if (pos == head)    //首节点处
    {
        PopFront(head);
    }
    else
    {
        ListNode* cur = head;    
        while (cur)
        {
            ListNode* next = cur->next;
            ListNode* nextnext = next->next;
            if (cur->next == NULL)    //尾节点处
            {
                PopBack(cur);
                break;
            }                    
            else if (next == pos)    //中间节点处
            {
                cur->next = nextnext;
                free(next);
                next = NULL;            
                break;
            }
            
            cur = cur->next;
        }
    }
}

//查找节点
ListNode* Find(ListNode* & head, DataType x)
{
    ListNode* cur = head;
    while (cur)
    {
        if (cur->data == x)
        {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

//打印节点
void PrintList(ListNode* & head)
{
    ListNode* cur = head;
    while (cur)
    {
        printf("%d->", cur->data);
        cur = cur->next;
    }
    printf("NULL\n");
}

void Test()
{
    ListNode* s = NULL;

    PushBack(s, 1);
    PushBack(s, 2);
    PushBack(s, 3);
    PushBack(s, 4);
    PushBack(s, 5);
    PrintList(s);

    PopBack(s);
    PrintList(s);

    PushFront(s, 0);
    PrintList(s);

    PopFront(s);
    PrintList(s);

    ListNode* p = s->next;
    Erase(s, p);
    PrintList(s);

    ListNode* ret = Find(s, 3);
    printf("%d\n", ret->data);

}
#endif    //__LIST_H__
时间: 2024-10-11 17:19:00

【C语言】用C语言实现单链表的所有操作的相关文章

嵌入式 Linux C语言(十二)——单链表

嵌入式 Linux C语言(十二)--单链表 一.单链表简介 1.单链表的结构 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以节点来表示的,每个节点由两部分构成:一个是数据域,存储数据值,另一个是指针域,存储指向下一个节点的指针. 2.单链表的节点 单链表节点的数据结构如下: typedef struct data { unsigned int id;//学生身份ID char name[LENGTH];//学生姓名 char subject[

单链表的基础操作

单链表中节点的查找.插入.删除.求单链表长度等操作. 按序号查找结点值 在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL. 按序号查找结点值的算法如下: LNode GetElem(LinkList L,int i){ //本算法取出单链表L(带头结点)中第i个位置的结点指针 int j=1; //计数,初始为1 LNode *p = L->next; //头结点指针赋给p if(i==0) return L; //若i等于0,

单链表的各种操作

#include <stdio.h> #include <stdlib.h> typedef struct { char data; struct Node * next; }Node, *LinkList; void meau(); LinkList CreateFromHead(); void ListLength(LinkList L); void printLink(LinkList L); LinkList inversePermutation(LinkList L);

单链表的相关操作

#ifndef _SLIST_H #define _SLIST_H #ifdef __cplusplus extern "C" { #endif /*******1. 不带头结点的单链表*****/ /***** *@链表结点结构定义 *@ m_data:数据 *@m_pNext:指向下一结点的指针 ***/ struct listNode { int m_data; listNode* m_pNext; }; /******* *@ 用数组array初始化链表,数组元素个数为n *@

数据结构关于单链表的一些操作的源代码

单链表的可以有许多问题,这是我特意整理一下的有关他的相关操作,给出代码,有需要的可以自己调试,重要的就是关于环的一些操作: #include <iostream>#include <cstdio>#include <cstdlib>#include <ctime>using namespace std;typedef int Elemtype;typedef struct Node{ Elemtype data; struct Node *next;}Nod

单链表的删除操作的实现(0953)swust-oj

#include<stdio.h>#include<stdlib.h>int total;typedef struct node{ int data; struct node * next;}Node;void CreateNode(Node *&L,int a[],int n)//尾插法建立单链表{ int i; Node *p,*r; L=(Node *)malloc(sizeof(struct node )); p=L; for(i=0;i<n;i++) { r

对带头结点的单链表的简单操作

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define DataType int           //int 可以改写为其它数据类型 typedef struct Node { DataType data; struct Node *next; }Node,*pNode;          //定义结点结构体      

单链表的环操作

链表介绍: 链表概念--链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来. 单链表演示图: 创建结构体 typedef int DataType; typedef struct ListNode { DataType data; struct ListNode *pNext; }SListNode, *PSListNode; 求环入口点: PSListNode FindEnterNode(PSListNode pHead, PSListN

算法数据结构 单链表的实现+操作 以及和顺序表的对比

顺序表和单链表的优缺点对比: 顺序表的优点,无需为表示表中元素之间的逻辑关系而增加额外的存储空间: 可以快速的存取表中的任意位置的元素. 顺序表的缺点,插入后删除操作需要移动大量元素: 当线性表长度不稳定时,存储空间难确定,容易造成存储空间碎片. 对于单链表 链式存储即元素存储的内存单元可以是不连续,分散的.对于元素间如何来维护他们的关系(即逻辑结构,每个元素的前驱和后继.) 即用到一个指针域来存储他和前驱或是后继直接的关系. 如上面的是一个单链表的指针结构,即每个元素中存储了他的后继元素的内存

链表-单链表的各种操作

单链表的结构体的定义 typedef struct LNode { ElemType data; struct LNode *next; }LinkList; 基本的单链表的操作 /* 功能:构建一个空的带头节点的单链表*/ Status InitList (struct LNode **L) { (*L) = (struct LNode *)malloc(sizeof(struct LNode)); //产生头节点 if(!*L) exit(OVERFLOW); (*L)->next = NU