【数据结构-链表】单链表

链表

特点

链表是通过任意的存储单元来存储线性表中的数据元素

链表组成

链表是由很对节点组成

带有头结点的单链表

typedef struct{
    struct node *head;//链表的头结点
}LinkList;

节点结构

typedef struct node{
    int data;
    struct node *next;
}Node;

链表的插入操作

  1. 首先得到插入位置的节点n
  2. 得到插入位置的前一个节点pre
  3. 讲新插入的节点的next指针指向n
  4. pre节点的next指向n

/**
 *  在p位置插入数值为i的节点
 *
 */
void insert(LinkList *list, int p, int x) {
    Node *node = (Node *)malloc(sizeof(Node));//创建一个新节点
    node->data = x;//给新节点的data赋值
    Node *n = list->head;//定义一个位置节点
    Node *pre = list->head;//定义位置前面的那个节点

    if(p == 0) {
        node->next = list->head->next;//头节点的后面那个节点赋给这个新节点的next
        list->head->next = node;//头结点的next指向这个节点
    } else {
        for(int i=1; i<=p; i++) {
            pre = n;//得到插入位置的前一个节点
            n = n->next;//得到插入位置的节点
            if(n == NULL) {
                printf("没有找到对应的位置\n;");
                return;
            }
        }
        pre->next = node;//前节点的next指向这个节点
        node->next = n;//这个节点的next指向以前的老节点
    }
}

删除操作

  1. 查找要删除的元素所在那个节点node
  2. 讲node的前一个节点的next指针指向node后面的节点
  3. free(node)

C语言实现单链表

#include <stdio.h>
#include <stdlib.h>
/**
 *  定义一个节点结构
 */
typedef struct node{
    int data;
    struct node *next;
}Node;

typedef struct{
    struct node *head;//链表的头结点
}LinkList;

/**
 *  创建链表
 *
 *  @param list 要创建的这个链表指针
 *  @param n    表示创建一个含有n个元素的链表
 */
void createList(LinkList *list, int n) {
    Node *tail;//该指针始终只想末尾的那个节点
    list->head = (Node *)malloc(sizeof(Node));
    tail = list->head;
    for (int i=0; i<n; i++) {
        Node *n = (Node *)malloc(sizeof(Node));
        printf("请输入新节点的数据:\n");
        scanf("%d", &n->data);
        n->next = NULL;
        tail->next = n;
        tail = n;
    }
}

/**
 *  删除链表中值为x的节点
 */
void delete(LinkList *list, int x) {
    Node *pre;
    Node *node = list->head->next;
    pre = list->head;
    if(list == NULL) {
        printf("链表为空!");
    }

    while(node->data != x && node != NULL) {
        pre = node;
        node = node->next;
    }

    if(node == NULL) {
        printf("没有找到这个元素!\n");
    } else {
        pre->next = node->next;
        free(node);
    }
}

/**
 *  在p位置插入数值为i的节点
 *
 */
void insert(LinkList *list, int p, int x) {
    Node *node = (Node *)malloc(sizeof(Node));//创建一个新节点
    node->data = x;//给新节点的data赋值
    Node *n = list->head;//定义一个位置节点
    Node *pre = list->head;//定义位置前面的那个节点

    if(p == 0) {
        node->next = list->head->next;//头节点的后面那个节点赋给这个新节点的next
        list->head->next = node;//头结点的next指向这个节点
    } else {
        for(int i=1; i<=p; i++) {
            pre = n;//得到插入位置的前一个节点
            n = n->next;//得到插入位置的节点
            if(n == NULL) {
                printf("没有找到对应的位置\n;");
                return;
            }
        }
        pre->next = node;//前节点的next指向这个节点
        node->next = n;//这个节点的next指向以前的老节点
    }
}

/**
 *  打印链表
 *
 *  @param list 要打印的链表
 */
void display(LinkList *list) {
    Node *node = list->head->next;
    while(node != NULL) {
        printf("链表元素%d\n", node->data);
        node = node->next;
    }
}

int main() {
    LinkList *list;
    createList(list, 4);
    display(list);
    delete(list, 3);
    printf("删除后的元素\n");
    display(list);
    insert(list, 2, 3);
    printf("插入后的元素\n");
    display(list);
    return 0;
}
时间: 2024-10-08 10:04:12

【数据结构-链表】单链表的相关文章

C#数据结构-单链表

理论基础: 链表是用一组任意的存储单元来存储线性表中的数据元素. 如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List). 单链表由头引用H唯一确定.头引用指向单链表的第一个结点,也就是把单链表第一个结点的地址放在H中. C#实现: 1接口 引用线性表的接口IListDS<T> 2实现 首先,必须定义一个单链表的节点类.  1 public class Node<T> 2    { 3        private T data

数据结构之单链表(C++实现)

有一段时间没有写一些关于数据结构的程序了,正好算法导论这门课学到红黑树,感觉数据结构都忘得差不多了,而且考研还要考,故再拿来复习一下. 一.C++实现单链表 #include<iostream> using namespace std; typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; void CreateList_L(LinkList &L, int n) { L = new LNode()

数据结构之——单链表

今天闲来无事,就打算把大一的时候写过的数据结构重温一遍,基本上我在大一之后只在单片机上用过几次顺序表和循环队列之外再就很少使用过数据结构了. 并且乘着写一下数据结构也可以熟悉熟悉vim. 首先定义单链表节点: 1 #define DataType int 2 3 struct node{ 4 DataType data; 5 struct node *next; 6 }; 7 struct node list,*p_list; 单链表这个数据结构需要一些函数来对她操作,一般需要有这些: 1.初始

数据结构(一) 单链表的实现-JAVA

数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数组.树这种顺序来学习数据结构这门课程把. -WH 一.单链表的概念 链表是最基本的数据结构,其存储的你原理图如下图所示 上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一

Java数据结构之单链表

链表的组成:链表头+结点 ? ?链表头一般只存储下一个节点的引用 ? ?节点:存数据+下一个节点的引用 链表头代码: package?com.xingej.algorithm.datastructure.linkedList.singleLinkedList; /** ?*?声明一个链表的头部 ?*? ?*?从链表头的使用,联想到hadoop,spark,netty中都有上下文context ?*? ?*[email protected]?erjun?2017年12月8日?上午8:45:08 ?

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No

数据结构之单链表

1. 链表的特点 链表是一种非线性.非顺序的物理结构,是由若干个节点组成. 链表采用的是“见缝插针”的存储方法,不要求内存连续,靠next指针关联起来. 链表的物理存储方式为随机存储,访问方式为顺序访问. 查找节点的时间复杂度为O(n),插入.删除节点的时间复杂度为O(1). 链表适用于写操作多,读操作少的场景. 1 //单向链表节点的数据结构 2 struct SingleListNode 3 { 4 int nData;//当前节点的数据 5 Node* pNext;//指向下一个节点的指针

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

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

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

数据结构:单链表结构字符串(python版)

1 #!/urs/bin/env python 2 # -*- coding:utf-8 -*- 3 4 #异常类 5 class stringTypeError(TypeError): 6 pass 7 8 #节点类 9 class Node(object): 10 def __init__(self, elem, next_ = None): 11 self.elem = elem 12 self.next = next_ 13 #单链表类 14 class single_list(obje