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

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

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)释放单链表h

#include <iostream>
#include <cstdio>
#include <cstdlib>

typedef char ElemType;
using namespace std;

typedef struct LNode
{
    ElemType data; //存放元素值
    struct LNode *next; //指向后继结点
}LinkNode;

//初始化单链表
void InitList(LinkNode * &h)
{
    h=(LinkNode *)malloc(sizeof(LinkNode));
    h->next=NULL; //创建头结点,其next域置为NULL
}

//尾插法插入元素
void CreateListR(LinkNode * &h,ElemType a[],int n)
{
    LinkNode *s,*r;
    r=h;
    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}

// 输出线性表
void DispList(LinkNode *h)
{
    LinkNode *p=h->next;
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}

// 求线性表长度
int  ListLength(LinkNode *h)
{
    int n=0;
    LinkNode *p=h;
    while(p->next != NULL)
    {
        n++;
        p=p->next;
    }
    return(n);
}

//判断线性表是否为空表
bool ListEmpty(LinkNode *h)
{
    return(h->next==NULL);
}

//输出指定下标的元素
char LocateElemByIndex(LinkNode *h,int i)
{
    LinkNode *p=h;
    while(p->next!=NULL&&i)
    {
        i--;
        p=p->next;
    }
    if(p->next==NULL)
        return(false);
    else
        return(p->data);
}

// 输出指定元素的位置
int LocateElem(LinkNode *h,ElemType e)
{
    int i=1;
    LinkNode *p=h->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return(0);
    else
        return(i);
}

//在指定位置上插入指定的元素
bool ListInsert(LinkNode *h,int i,ElemType e)
{
    int j=0;
    LinkNode *p=h,*s;
    if(i<=0) return false;
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
    {
        return false;
    }else
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
        return true;
    }
}

//删除指定下标的元素
bool ListDelete(LinkNode * &h,int i,ElemType &e)
{
    int j=0;
    LinkNode *p=h,*q;
    if(i<=0) return false;
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
        return false;
    else
    {
        q=p->next;
        p->next=q->next;
        free(q);
        return true;
    }
}

//释放单链表h
void DestroyList(LinkNode *&h)
{
    LinkNode *pre=h,*p=h->next;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=pre->next;

    }
    free(pre);
    cout<< "List has been destroyed!"<<endl;
}
int main()
{
    LinkNode *h;
    char e;
    InitList(h);
    char a[5]={'a','b','c','d','e'};
    CreateListR(h,a,5);
    DispList(h);
    cout<< ListLength(h) <<endl;
    if(ListEmpty(h))
    {
        cout<< "List is Empty!"<<endl;
    }else
    {
        cout<<"List isn't Empty!"<<endl;
    };
    cout<< LocateElemByIndex(h,3)<<endl;
    cout<< LocateElem(h,'a')<<endl;
    ListInsert(h,4,'f');
    DispList(h);
    ListDelete(h,3,e);
    DispList(h);
    DestroyList(h);
    return 0;
}

运行结果如下图:

0x3 总结

感觉自己写单链表还不是很熟练,争取能多抽出点时间去好好学习数据结构,come on!

原文地址:https://www.cnblogs.com/xq17dog/p/10597768.html

时间: 2024-10-11 20:50:45

数据结构学习之单链表基本操作的相关文章

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

数据结构学习之双链表基本操作 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)

c++学习笔记—单链表基本操作的实现

用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: [cpp] view plaincopy #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct Lnode { int data; struct 

C++ 数据结构学习二(单链表)

模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespace std; template<class T>struct Node{ T data; Node * next;}; template<class T>class LinkList{ public: LinkList(); //无参构造函数,建立只有头结点的空链表 LinkList

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

PHP数据结构之实现单链表

学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $next; public function __construct($id,$name) //构造函数 { $this->id=$id; $this->name=$name; $this->next=null; } } class linklist //链表的数据结构 { private $he

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

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

数据结构之_单链表的实现

数据结构之_单链表的实现 1.基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 单链表 线性表的链式存储结构中,每个节点中只包含一个指针域,这样的链表叫单链表. 通过每个节点的指针域将线性表的数据元素按其逻辑次序链接在一起(如图). 概念解释: 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息

数据结构复习--java实现单链表基本操作

单链表的基本操作包括建立单链表.查找运算(按序查找和按值查找).插入运算(前插和后插)和删除运算.下面给出具体的java实现程序: package com.zpp.test; //首先创建一个节点类 public class Node { private Node next; //指针域 private int data;//数据域 public Node( int data) { this. data = data; } } package com.zpp.test; public class

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

[摘要]本文讨论的均为带头结点的线性链表的基本操作,包括创建.删除.插入.打印等等,欢迎大家批评指正错误. (1)单链表存储结构 typedef struct LNode { int data; struct LNode *next; }LinkList; (2)创建链表 /* 功能:构建一个空的带头节点的单链表*/ Status InitList (struct LNode **L) { (*L) = (struct LNode *)malloc(sizeof(struct LNode));