基础数据结构——单链表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础数据结构——单链表相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

顾名思义,尾插法就是将结点插在单链表的尾部,此时就需要一个指向单链表尾结点的指针(可以在结点定义的时候就直接多一个尾指针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,进入下一轮循环
}
}
View Code

 

以上是关于基础数据结构——单链表的主要内容,如果未能解决你的问题,请参考以下文章

基础数据结构——单链表

数据结构基础---C语言实现单链表

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

数据结构单链表的增删查改,附代码+笔记gitee自取

数据结构与算法基础之非循环单链表创建和链表遍历

创建单链表