数据结构 单链表



#ifndef LINKLIST_H

#define LINKLIST_H

#include<iostream>

using namespace std;

template <typename T>

struct Node

{

T data;

Node<T> *next;

};

template <typename T>

class LinkList

{

public:

LinkList();                       //无参构造函数,建立只有头结点的空链表

LinkList(T a[], int n);           //有参构造函数,建立由n个元素的单链表

~LinkList();                      //析构函数

int Length();                     //求单链表的长度

T Get(int i);                     //按位查找,查找单链表中的第i个元素的数值

int Locate(T x);                  //查找该元素在单链表中的位置

void Insert(int i, T x);          //在第i个位置插入该元素

T Delete(int i);                  //删除第i个元素

void PrintList();                 //打印单链表

private:

Node<T> *first;                  //创建单链表的头指针

};

template <typename T>

LinkList<T>::LinkList()

{

Node<T> *first;                  //申明头结点

first = new Node<T>;             //生成头结点

first->next = NULL;              //初始化头节点

}

template <typename T>

LinkList<T>::LinkList(T a[], int n)

{

Node<T> *r, *s;                //申明两个临时结点

first = new Node<T>;           //生成头结点

r = first;                     //尾指针初始化

for (int i = 0; i < n; i++)

{

s = new Node<T>;           //生成S结点来存储数组中对应的元素

s->data = a[i];            //将数组中对应的元素赋值到对应结点的数值部位

r->next = s;

r = s;                     //上两部是将s插入到终端结点之后

}

r->next = NULL;

}

template <typename T>

LinkList<T>::~LinkList()

{

Node<T> *q = NULL;            //建立一个空的结点

while (first != NULL)         //该循环释放结点的存储空间

{

q = first;

first = first->next;

delete q;

}

}

template <typename T>

int LinkList<T>::Length()

{

Node<T>*p=first->next;

int count = 0;                   //初始化

while (p != NULL)

{

p = p->next;                //p指针后移

count++;

}

return count;

}

template <typename T>

T LinkList<T>::Get(int i)

{

Node<T> *p = first->next;

int count = 1;

while (p != NULL&&count < i)

{

p = p->next;

count++;

}

if (p == NULL)throw"位置";

else return p->data;           //单恋表中first是空结点,不算在单链表中的,所以第一个元素是在第一个结点中的。序号是对应的

}

template <typename T>

int LinkList<T>::Locate(T x)

{

Node<T> *p = first->next;

int count = 1;               //上述初始化工作量

while (p != NULL)

{

if (p->data == x)

return count;

p = p->next;

count++;

}

return 0;                    //推出循环查找,表示查找失败。

}

template <typename T>

void LinkList<T>::Insert(int i, T x)

{

Node<T> *p = first;

int count = 0;               //上述初始化工作量

while (p != NULL&&count < i - 1)

{

p = p->next;

count++;

}

if (p == NULL)throw"位置";

else

{

Node<T> *s;

s = new Node<T>;

s->data = x;

s->next = p->next;

p->next = s;

}

}

template <typename T>

T LinkList<T>::Delete(int i)

{

Node<T> *p = first;

T x;

int count = 0;

while (p != NULL&&count < i - 1)

{

p = p->next;

count++;

}

if (p == NULL || p->next == NULL)throw"位置";

else

{

Node<T> *q;

q = p->next; x = q->data;

p->next = q->next;

delete q; return x;

}

}

template <typename T>

void LinkList<T>::PrintList()

{

Node<T> *p;

p = first->next;

while (p != NULL)

{

cout << p->data<<"->";

p = p->next;

}

}

#endif

*******************************************************************

#include"LinkList.h"

#include<iostream>

#include<iomanip>

using namespace std;

void main()

{

int a[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };

int ch;

LinkList<int> zxh(a,10);

cout << "生成的单链表为:";

zxh.PrintList();

cout << endl;

cout << "1-求长度"<<setw(17);

cout << "2-按位查找" << endl;

cout << "3-按值查找" << setw(15);

cout << "4-插入操作" << endl;

cout << "5-删除操作" << setw(15);

cout << "6-遍历操作" << endl;

cout << "请输入您想进行的操作:";

cin >> ch;

switch (ch)

{

case 1:zxh.Length(); break;

case 2:int m1;

cout << "请输入您想按位查找的位号:";

cin >> m1;

zxh.Get(m1); break;

case 3:

int m2;

cout << "请输入您想查找的值:";

cin >> m2;

zxh.Locate(m2); break;

case 4:int m3, m4;

cout << "请输入想插入的位置:";

cin >> m3;

cout << "请输入想插入的元素:";

cin >> m4;

zxh.Insert(m3, m4); break;

case 5:

int m5;

cout << "请输入想删除的位置:";

cin >> m5;

zxh.Delete(m5); break;

case 6:

zxh.PrintList();

}

}

这个单恋表中我自己刚才测试了一下。基本上没什么大问题。但是好像在球长度的时候就不正确了。希望大家可以提出指证。

时间: 2024-12-27 21:53:29

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

python实现数据结构单链表

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

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

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

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

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

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 =

大话数据结构---单链表

单链表在存储结构上与顺序存储的区别:不用开辟连续的存储空间,存储位置任意,只需要让数据的前驱知道它的位置就可以,而使用单链表示只需要知道单链表的第一个元素就能找到其他所有的元素,为了方便 一般会设置一个头指针指向第一个元素. 单链表的数据读取:通过头指针一个一个往后遍历 单链表的插入: 删除: 自定义单链表的简单实现: package com.neuedu.entity; /* * 项目名称:JavaSqList * @author:wzc * @date 创建时间:2017年9月2日 上午9:

C实现通用数据结构--单链表

单链表概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 从概念上讲,可以把链表想象成一系列连续的元素,然而,由于这些元素是动态分配的(C语言中使用malloc),切记这些元素通常实际上都是分散在内存空间的 本文地址:http://www.cnblogs.com/archimedes/p/c-datastruct-linklist.html,转载请注明源地址. 单链表的接口定义: 1.list_init void list_init(Li

数据结构——单链表

1.对于一个有数据的单链表,如果要对其初始化,使用下列操作: 1 void initList(sqlist &L){ #对于需要改变的变量或链表,使用引用型 2 L.length==0; 3 } //单链表长度重置为0 2.单链表有4中操作:归并,插入,删除,查找 归并的实现:(链表A,B是有序的,且归并后的C也是有序的)如下: 1 void merge(LNode *A,LNode *B,LNode *&C){ //将A B两个链表归并为一个新的单链表(链表C采用引用型) 2 LNode