基础数据结构——单链表

线性表根据存储结构可以分为链式存储和顺序存储。

顺序存储实际上可以理解为结构体数组,要求逻辑上相邻的元素在物理上也是相邻的;

而链式存储没有这样的要求,这样就便于元素的插入删除操作(顺序存储在插入删除操作时需要移动大量的元素)。

定义单链表结点
typedef struct Node{
   int element;    //结点元素
   struct Node* next; //结点指针
}Node,*LinkList;
LinkList CreateList_head();
LinkList CreateList_tail();
void print(LinkList L);

在进行创建链表的时候有两种方法,一种称之为尾插法另一种就是头插法;

顾名思义,尾插法就是将结点插在单链表的尾部,此时就需要一个指向单链表尾结点的指针(可以在结点定义的时候就直接多一个尾指针r域);

头插法就是将结点插在单链表的头不过这样的话单链表的结点元素顺序就是相反的;

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include "LinkList.h"
using namespace std;

//头插法创建链表
LinkList CreateList_head(){
   LinkList L =  (Node*)malloc(sizeof(Node)); //创建头结点
   L->next = NULL;
   int x;
   cin>>x;
   while(x!=9999){ //输出9999结束
    Node* p = (Node*)malloc(sizeof(Node));
    p->element = x;
    p->next = L->next;
    L->next = p;
    cin>>x;
   }
   return  L;
}
LinkList CreateList_tail(){
    LinkList L = (Node*)malloc(sizeof(Node)); //创建头结点
    L->next=NULL;
    Node* r = L;    //一个指向尾结点的指针
    int x;
    cin>>x;
    while(x!=9999){
         Node* p = (Node*)malloc(sizeof(Node));
         p->element = x;
         p->next = NULL; //使当前结点作为尾结点后next域为NULL
         r->next = p;
         r = p;
         cin>>x;
    }
    return L ;
}

//输出单链表结点
void print(LinkList L){
    Node* p = L->next;
    cout<<"the LinkList is:"<<endl;
    while(p){
        cout<<p->element<<endl;
        p=p->next;
    }
}

//链表的逆置
//使用头插法进行单链表的逆置操作

void reverse(LinkList &L){
    Node* r  = L->next; //r指针指向单链表的第一个结点
    L->next = NULL;  //将头结点脱链
    while(r){    //r指向单链表的下一个待链接结点
    Node* p = r->next;   //p指向r的下一个结点在一次链接完成后赋值给r防止断链
    r->next = L->next;  //将r指向的结点新的逆置单链表中
    L->next = r ;
    r = p;     //暂存的p结点指针赋值给r,进入下一轮循环
}
}

时间: 2024-09-30 16:37:09

基础数据结构——单链表的相关文章

python实现数据结构单链表

#python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" def __init__(self, elem): self.elem = elem self.next = None # 节点一开始初始化的时候并不知道下一个元素的地址,所以先设置为空 class SingLinkList(object): """单链表""

数据结构基础(8) --单链表的设计与实现(1)之基本操作

链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N); 链表的特点: 由于在链表中插入/删除元素都不需要进行数据的移位, 只需要O(1)时间完成, 因此链表适用于频繁插入与删除的情况; 但是链表也有缺点

数据结构和算法基础之单链表

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { public class Node<T> { public T Data; public Node<T> Next; public Node() { Data = default(T); N

C# 数据结构 - 单链表 双链表 环形链表

链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一个节点一个节点去访问,这样所花的时候就比较多了.(顺序表可以弥补这缺点,但插入和删除就非常耗性能) 单链表 单链表的构成:必须要有一个链表头(head),每个节点里面有一个Next用于指向下一个节点(类似于指针).最后一个节点的Next为null来标识链表的尾. 如下图 代码实现 1 /* ----

数据结构—单链表(类C语言描写叙述)

单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List). 链表的详细存储表示为: ① 用一组随意的存储单元来存放线性表的结点(这组存储单元既能够是连续的.也能够是不连续的) ② 链表中结点的逻辑次序和物理次序不一定同样.为了能正确表示结点间的逻辑关系,在存储每一个结点值的同一时候,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 注意: 链式存储是最经常使用的存储方式之中的一个.它不仅可用来表示线性表.并且可用来表示各种非线性

C# 数据结构--单链表

什么是单链表 这两天看到很多有关单链表的面试题,对单链表都不知道是啥的我.经过学习和整理来分享一下啥是单链表和单链表的一些基本使用方法.最后看些网上有关单链表的面试题代码实例. 啥是单链表? 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.这组存储单元既可以是连续的,也可以是不连续的. 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据. 链表的结点结构

数据结构单链表实现

<数据结构>中单链表的实现c代码 转自:http://blog.chinaunix.net/uid-22750250-id-1769905.html include.h /******************************************************************      程序中要用的头文件******************************************************************/ #include<st

数据结构-单链表-类定义2-C++

上一次的C++链表实现两个单链表的连接不太理想,此次听了一些视频课,自己补了个尾插法,很好的实现了两个链表的连接,当然了,我也是刚接触,可能是C++的一些语法还不太清楚,不过硬是花了一些时间尽量在数据结构中将c++的语言特点表现出来.一开始也是不愿意读c++的数据结构,只是一种挑战心里,不想读着读着感觉自己太low了,c++的内容更加丰富,所以还得多多练习...... 头文件 1 #ifndef LIST_H 2 #define LIST_H 3 #include <iostream> 4 5

Java数据结构——单链表

一.单链表的概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.这组存储单元可以是连续的,也可以是不连续的. 存储单元由两部分组成,数据源和指针,数据源放数据,指针指向下个存储单元. 二.单链表的结构 采用Node实体类类标识,其中data为存储的数据,next为下一个结点的指针. //链表的实体类 class Node{ public int data; public Node next; public Node(int data) { this.data =