数据结构学习之单向链表的基本操作(非递归实现)

【摘要】本文讨论的均为带头结点的线性链表的基本操作,包括创建、删除、插入、打印等等,欢迎大家批评指正错误。

(1)单链表存储结构

typedef struct LNode
{
     int data;
     struct LNode *next;
}LinkList;

(2)创建链表

/* 功能:构建一个空的带头节点的单链表*/
Status InitList (struct LNode **L)
{
    (*L) = (struct LNode *)malloc(sizeof(struct LNode)); //产生头节点

    if(!*L){
        return ERROR;
    }

    (*L)->next = NULL;//作为结束标志位

    return OK;
}

(3)删除链表

/*带头结点链表删除*/
Status ClearList(struct LNode *L)//
{
    LinkList *p,*q;
    p = L->next; //第一个结点

    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }

    L->next = NULL; //头结点指针域清空
    return OK;
}

(4)插入数据

/* 在带头节点的单链表L中的第i个位置之前插入元素e*/
Status ListInsert(struct LNode *L,int i,int e)
{
    int j =0;
    struct LNode *p=L,*s=NULL;

    while(p && j<i-1)
    {
        p=p->next;
        j++;
    }

    if(!p || j>i-1)//没有找到
        return ERROR;

    s = (struct LNode *)malloc(sizeof(struct LNode));

    if(!s)
        printf("malloc error~\n");

    s->data = e;
    s->next = p->next;//插入节点
    p->next = s;

    return OK;
}

(4)删除单个节点

/*在带头节点的单链表中删除第i个元素,并有e返回其值*/
Status ListDelete(LinkList *L,int i,int *e)
{

    LinkList *p=L,*q;
    int j=0;

    while(p->next && j< i-1)
    {
        p = p->next;
        j++;
    }

    if(!p->next || j>i-1)
        return ERROR;

    q = p->next; //保存下来
    p->next = q->next;
    *e = q->data;

    free(q);
    return OK;
  }

(5)打印数据

/* 依次对L的每个元素打印输出数据*/
Status ListTraverse(struct LNode *L,void (*vi)(int))
{
    LinkList *p = L->next;  //第一个结点

    while(p)
    {
        printf("%d\n", p->data);
        p = p->next;
    }

    printf("\n");
    return OK;
}
时间: 2024-11-03 21:07:59

数据结构学习之单向链表的基本操作(非递归实现)的相关文章

文章分享:简单数据结构学习:单向链表

文章分享:简单数据结构学习:单向链表:https://www.textarea.com/aprikyb/jiandan-shujujiegou-xuexi-danxiang-lianbiao-252/

Snail—数据结构学习之单向链表

// 定义链表的数据结构 typedef struct _LINK_NODE{ int data; struct _LINK_NODE * next; }LINK_NODE; //创建一个单向链表 LINK_NODE * create(){ int inputFlag = 1,value; LINK_NODE *head,*p,*s; head = (LINK_NODE *)malloc(sizeof(LINK_NODE)); p = head; while (inputFlag) { prin

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)

链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)

1.指针的联动 通过两个指针分别指向前驱和后继结点,并在单向链表上进行移动,当指针指向待处理的结点时,该结点的前驱也有指针指向. 2.设有一个无序单向链表,且数据域的值均不相同,使指针pmin指向最小值结点,并使指针prem指向最小值结点的前驱结点: 代码片段: for(p = head; p; q = p, p = p->next) { if(pmin->data > p->data) { pmin = p; prem = q; } } 3.单向链表的删除算法 注:使用mallo

java版的单向链表的基本操作

首先定义链表节点的结构: package com.moluo.linklist; /** * * @author 行者摩罗 * */ public class Node { private int data; private Node next; public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next;

数据结构与算法-单向链表

概述 由于最近在工作中需要用到树形结构来解决一些问题,所以萌生了系统学习“数据结构和算法”的想法,于是乎从最简单的表结构开始.由于数组是最简单的表结构的实现,也是各个编程语言内置的数据类型,所以不做更多的记录.表结构中以下实现打算学习: LinkedList Stack Queue HashTable Dictionary 本篇为学习数据结构的第一篇随笔,从最简单的单向链表开始吧. 实现(C#) 平台:dotNet Core 1.0, C# IDE:VSCode 如果考虑算法复用的话,可以实现泛

线性表之单向链表的基本操作实现

这篇文章用来回顾单向链表的相关知识并实现如下几个操作: 初始化 插入 删除 逆置 销毁 且实现的链表为带头节点的单线非循环链表.由于链表在尾插入时需要遍历到链表的最后一个位置,所以我需要记住最后一个节点的位置,为此,本文会简单的实现一个单向链表的类. 0.链表的定义与类中提供的API 1 typedef int ELEMENT; 2 3 struct Node_s { 4 Node_s():data(),NEXT(nullptr){} 5 ELEMENT data; 6 Node_s * NEX

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod