数据结构之线性表(链表)

链表

1.链表的定义:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是

连续的,也可以是不连续的)。因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素

ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组

成数据元素ai的存储映像,称为结点。它包括两个域,其中存储数据元素信息的域称为数据域;存储直接后继存储位置的

域称为指针域。指针域中存储的信息称做指针或链。n个结点(ai(1<=i<=n)的存储映像)链结成一个链表,即为线性表的

链式存储结构。又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表。

2.链表的数据结构

#define ElemType int
typedef struct ListNode
{
    ElemType data;
    ListNode *next;
}ListNode;
typedef struct List
{
    ListNode *first;
    ListNode *last;
    size_t size;
}List;

3.在链表中有以下操作:

void InitList(List *list);
bool push_back(List *list, ElemType x);
bool push_front(List *list, ElemType x);
void show(List *list);
void pop_back(List *list);
bool insert_val(List *list, ElemType x);
bool delete_val(List *list, ElemType key);
ListNode *find_key(List *list, ElemType key);
void clear_list(List *list);
void reverse_list(List *list);
void sort_list(List *list);
void destroy_list(List *list);

以上声明的方法有:(1)初始化一个链表.(2)尾插法向链表中添加元素.(3)头插法向链表中添加元素.(4)展示链表

内容.(5)尾部删除链表中的数据元素.(6)按值向链表中插入数据元素.(7)按值删除链表中的数据元素.(8)按值查找

链表中的数据数据元素.(9)清空链表操作.(10)逆序排列链表中的数据元素.(11)对链表中的数据元素进行排序.(12)

销毁链表.

4.将上面所声明的方法在LinkList.h的头文件中进行实现:

#ifndef _LINKLIST_H
#define _LINKLIST_H

#include <iostream>
#include <assert.h>
using namespace std;

#define ElemType int
typedef struct ListNode
{
    ElemType data;
    ListNode *next;
}ListNode;
typedef struct List
{
    ListNode *first;
    ListNode *last;
    size_t size;
}List;

void InitList(List *list);
bool push_back(List *list, ElemType x);
bool push_front(List *list, ElemType x);
void show(List *list);
void pop_back(List *list);
bool insert_val(List *list, ElemType x);
bool delete_val(List *list, ElemType key);
ListNode *find_key(List *list, ElemType key);
void clear_list(List *list);
void reverse_list(List *list);
void sort_list(List *list);
void destroy_list(List *list);

void InitList(List *list)
{
    list->first = list->last = (ListNode*)malloc(sizeof(ListNode));
    list->last->next = NULL;
    assert(list->first != NULL);
    list->size = 0;
}

bool push_back(List *list, ElemType x)
{
    ListNode *s = (ListNode*)malloc(sizeof(ListNode));
    if (s == NULL)
        return false;
    s->data = x;
    s->next = NULL;
    list->last->next = s;
    list->last = s;
    list->size++;
    return true;
}

bool push_front(List *list, ElemType x)
{
    ListNode *s = (ListNode*)malloc(sizeof(ListNode));
    if (s == NULL)
        return false;
    s->data = x;
    s->next = list->first->next;
    list->first->next = s;
    if (list->size == 0)
        list->last = s;
    list->size++;
    return true;
}

void show(List *list)
{
    ListNode *p = list->first->next;
    while (p != NULL)
    {
        cout << p->data << "->";
        p = p->next;
    }
    cout << "Over." << endl;
}

void pop_back(List *list)
{
    if (list->size == 0)
        return;
    ListNode *p = list->first;
    while (p->next != list->last)
        p = p->next;
    p->next = NULL;
    free(list->last);
    list->last = p;
    list->size--;
}

bool insert_val(List *list, ElemType x)
{
    ListNode *p = list->first;
    while (p->next != NULL && p->next->data < x)
        p = p->next;
    ListNode *s = (ListNode*)malloc(sizeof(ListNode));
    if (s == NULL)
        return false;
    s->data = x;
    s->next = NULL;
    s->next = p->next;
    p->next = s;
    if (p == list->last)
        list->last = s;
    list->size++;
    return true;
}

bool delete_val(List *list, ElemType key)
{
    if (list->size == 0)
        return false;
    ListNode *p = list->first;
    while (p->next != NULL && p->next->data != key)
        p = p->next;
    if (p->next == NULL)
        return false;
    ListNode *q = p->next;
    p->next = q->next;
    if (q == list->last)
        list->last = p;
    free(q);
    list->size--;
    return true;
}

ListNode *find_key(List *list, ElemType key)
{
    if (list->size == 0)
        return false;
    ListNode *p = list->first->next;
    while (p != NULL &&p->data != key)
        p = p->next;
    return p;
}

void clear_list(List *list)
{
    if (list->size == 0)
        return;
    ListNode *p = list->first->next;
    while (p != NULL)
    {
        list->first->next = p->next;
        free(p);
        p = list->first->next;
    }
    list->last = list->first;
    list->size = 0;
}

void reverse_list(List *list)
{
    if (list->size <= 1)
        return;
    ListNode *p = list->first->next;
    ListNode *q = p->next;
    list->last = p;
    list->last->next = NULL;
    while (q != NULL)
    {
        p = q;
        q = p->next;
        p->next = list->first->next;
        list->first->next = p;
    }
}

void sort_list(List *list)
{
    if (list->size <= 1)
        return;
    ListNode *p = list->first->next;
    ListNode *q = p->next;
    list->last = p;
    list->last->next = NULL;
    ListNode *t;
    while (q != NULL)
    {
        p = q;
        q = q->next;
        t = list->first;
        while (t->next != NULL && p->data > t->next->data)
            t = t->next;
        if (t->next = NULL)
            list->last = p;
        p->next = t->next;
        t->next = p;
    }
}

void destroy_list(List *list)
{
    clear_list(list);
    free(list->first);
    list->first = list->last = NULL;
}
#endif

5.将上面所实现的方法在主函数中调用实现:

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

int main()
{
    List mylist;
    InitList(&mylist);

    ListNode *p = NULL;
    ElemType item;
    int pos;
    int select = 1;
    while (select)
    {
        cout << "******************************************" << endl;
        cout << "*[1] push_back       [2] push_front      *" << endl;
        cout << "*[3] Show            [4] pop_back        *" << endl;
        cout << "*[5] insert_val      [6] delete_val      *" << endl;
        cout << "*[7] find_key        [8] reverse_list    *" << endl;
        cout << "*[9] sort_list       [10] clear_list     *" << endl;
        cout << "*[0] quit_system                         *" << endl;
        cout << "******************************************" << endl;
        cout << "请选择:>";
        cin >> select;
        switch (select)
        {
        case 1:
            cout << "请输入要插入的数据(-1结束):>";
            while (cin >> item, item != -1)     //逗号表达式
            {
                push_back(&mylist, item);
            }
            break;
        case 2:
            cout << "请输入要插入的数据(-1结束):>";
            while (cin >> item, item != -1)
            {
                push_front(&mylist, item);
            }
            break;
        case 3:
            show(&mylist);
            break;
        case 4:
            pop_back(&mylist);
            break;
        case 5:
            cout << "请输入要插入的值:>";
            cin >> item;
            insert_val(&mylist, item);
            break;
        case 6:
            cout << "请输入要删除的值:>";
            cin >> item;
            delete_val(&mylist, item);
            break;
        case 7:
            cout << "请输入要查找的值:>";
            cin >> item;
            p = find_key(&mylist, item);
            if (p == NULL)
            {
                cout << "要查找的值:" << item << "不存在!" << endl;
            }
            break;
        case 8:
            reverse_list(&mylist);
            break;
        case 9:
            sort_list(&mylist);
            break;
        case 10:
            clear_list(&mylist);
            break;
        }
        system("pause");
        system("cls");
    }
    destroy_list(&mylist);

    return 0;
}

原文地址:https://www.cnblogs.com/XNQC1314/p/8331385.html

时间: 2024-08-29 09:32:46

数据结构之线性表(链表)的相关文章

数据结构之 线性表--链表的逆置

数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据. 输入 输入多个整数,以-1作为结束标志. 输出 输出逆置后的单链表数据. 示例输入 12 56 4 6 55 15 33 62 -1 示例输出 62 33 15 55 6 4 56 12 #include <iostream> #include <

数据结构学习---线性表链表实现

链表 首先是结构体 typedef int ElementType; //为了便于修改链表中元素的类型 typedef struct Node{ ElementType Date; struct Node* Next; }List; List L,*Ptrl; 求链表长度的函数 int length(List *Ptrl){ List* p =Ptrl; int j=0; while(p){ p=p->Next; j++; } return j; } 通过位置查找 List* FindKth(i

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

数据结构:线性表之单链表

线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储结构: ①顺序存储结构,即存储单元在一段连续的地址上存储,常见的数组就是顺序存储结构的线性表: ②链式存储结构,即存储单元在不连续的地址上存储.因为其不连续性,除了要存数据元素信息(数据域)外,还要存储它后继元素(结点)的地址(指针域,链).学习链式结构最好将结点结构牢记于心,如下图: 链表的每个结点只含有一个指

软考之路--数据结构之线性表

数据就是数值,也就是我们通过观察.实验或计算得出的结果.数据有很多种,最简单的就是数字.数据也可以是文字.图像.声音等.数据可以用于科学研究.设计.查证等.结构,组成整体的各部分的搭配和安排,两者完美结合在一起,我们这样需要重新认识她,对她重新审视与定义:数据结构是程序设计的重要理论和技术基础,她所讨论的内容和技术,对从事软件项目的开发有重要作用,通过学习数据结构,我们学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所设计的数据悬着适当的逻辑结构.存储结构及其相应的操作方法,为提高应

自学数据结构——顺序线性表

胡乱写了一些代码 /* ============================================================================ Name : sqlist.c Author :codecup Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ==========================================

自学数据结构——顺序线性表2

1 /* 2 ============================================================================ 3 Name : sqlist.c 4 Author : codecup 5 Version : 6 Copyright : Your copyright notice 7 Description : Hello World in C, Ansi-style 8 ==================================

数据结构:线性表插入一次删除一次的代码

#include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cstdio> using namespace std; int insertsqlist(int weizhi,double charu,int *t,double b[]){   

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI