数据结构----线性表顺序和链式结构的使用(c)

PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写好了,java还有三个特性,封装、继承、多态。当然这里不是讲Java,这里主要是说内部结构,大家都知道数据结构有些东西是分为逻辑结构和物理结构的,物理结构有分为顺序结构和链式结构,有不懂得可以百度百科,这里主要是分享线性表的顺序结构。那么什么是线性表呢,线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

线性表

  • 顺序表
  • 链式表

1:顺序表分析

  •   结构体创建
  •   初始化顺序表
  •   插入操作
  •   删除操作
  •   查找操作
  •   修改操作

由于顺序表比较简单,这里解释都在代码中,在外就不在赘述。

1-1:结构体的创建

#define ElemType int
#define MAXSIZE 100     //定义变量不需要分号。
//创建线性表
typedef struct {
    ElemType elem[MAXSIZE];
    int length;        //长度
} SqList;

1-2:初始化顺序表

int InitList(SqList &L) {
    // 初始化表,一个空表。
    L.length = 0;
    return 0;
}

1-3:操作方法

/**
 * @descibe 插入元素
 * @param L 线性表
 * @param pos 所在位置(并非角标)
 * @param data 插入元素
 * */
int ListInsert(SqList &L, int pos, ElemType data) {
    if (pos < 1 || pos > L.length + 1) {
        printf("插入的不合法");
        return -1;
    }
    int i;
    //在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
    for (i = L.length; i >= pos; i--) {
        L.elem[i] = L.elem[i - 1];
    }
    L.elem[pos - 1] = data;
    L.length++;
    return 0;//
}
/**
 * 线性表中删除操作
 * @param L 线性表
 * @param pos 所在位置(并非角标)
 * @param data 插入元素
 * */
int ListDelete(SqList &L, int pos, int data) {
    if (pos < 1 || pos > L.length) {
        printf("删除角标不合法");
        return -1;
    }
    if (!(L.elem[pos - 1] == data)) {
        printf("没有这个数字");
        return -1;
    }
    int i;
    //在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
    for (i = pos; i <= L.length; i++) {
        L.elem[i - 1] = L.elem[i];
    }
    L.length--;
    return 0;//返回0表示成功;
}
//查找数据
int queryList(SqList L, int e) {
    //如果小于1证明没有数据,则直接返回。
    if (L.length < 1) {
        printf("表中没有数据");
        return -1;
    }
    for (int i = 0; i < L.length; i++) {
        if (L.elem[i] == e) {
            printf("找到该数据:%d角标为:%d \n", L.elem[i], i);
        }
    }
    return 0;
}

//修改数据
int xiugai(SqList &L, int pos, int e) {
    if (pos < 1 || pos > L.length) {
        printf("修改角标不合法");
        return -1;
    }
    L.elem[pos - 1] = e;
    return 0;

}
//打印全部数据
void PrintF(SqList L) {
    printf("打印表中所有元素\n");
    int i;
    for (i = 0; i < L.length; i++) {
        printf("%d\n", L.elem[i]);
    }
}

综上所述:线性表和之前的数组类似,很容易理解。在使用的过程记得声明一下方法(函数);

2:链表分析

  •   结构体创建
  •   初始化顺序表
  •   插入操作
  •   删除操作
  •   查找操作
  •   修改操作

需要注意的是这里的结构体需要一个指针,前一个结点的指针指向下一个结点,依次类推,最后一个指针指向NULL;

2-1:结构体创建

/**
 * @describe 创建一个结构体
 *  SLink *next指针;
 * *SLinkListL 创建一个结构体指针
 * */
typedef struct SLink {
    int data;
    struct SLink *next;
} SLink, *SLinkListL;

2-2:初始化链表

/**
 * @describe 初始化链表
 * */
SLinkListL initLinkL() {
    //1:分配一个空间
    SLinkListL sLinkListL = (SLinkListL) malloc(sizeof(SLink));
    //2:判断是否创建成功
    if (!sLinkListL) {
        exit(-1);
    }
    sLinkListL->next = NULL;
    printf("初始化单链表成功\n");
    return sLinkListL;
}

2-3:操作--增删该查

这里需要注意的是修改这个操作,找p的时候要找到要修改的p,而不是前一个结点,比如说,咱们在第二个位置插入的时候要找到第一个位置作为p,二修改的时候就要找到第二个位置,也就是说pos传值的时候不用减一。

/**
 * @describe 插入操作
 *
 * @param L 链表类型
 * @param pos 插入位置
 * @param e 插入元素
 * */
int insertLinkL(SLinkListL &L, int pos, int e) {
    SLinkListL p = L;
    //判断是否符合链表的长度;
    int i = 0;
    //判断长度,寻找要插入的位置(前一位);
    while (p && i < pos-1) {
        p = p->next;
        i++;
    }
    //判断长度是否超过pos
    if (!p || i > pos-1) {
        return 0;
    }
    //为新元素创建结点(分配空间)
    SLinkListL s = (SLinkListL) malloc(sizeof(SLink));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return 1;
}

/**
 * @describe 删除操作
 * @param L 链表类型
 * @param pos 删除位置
 * @param e 删除存放元素
 * */
int deleteLinkL(SLinkListL &L, int pos, int *e) {
    SLinkListL p = L;
    //1:判断位置
    int i = 0;
    while (p && i < pos-1) {
        p = p->next;
        i++;
    }
    if (!p || i > pos-1) {
        printf("删除位置不合法\n");
        return -1;
    }
    //定义一个空的变量,用于存放p的指针,入a1,a2,a3,如果要删除a2,则p指向a1,此时,把a1的next先交给s(暂存,此时代表a2(因为a1的指针是指向a2)),然后用s去取下一个指针(next)就是a3,
    SLinkListL s;//s为了释放掉删除元素的空间
    s = p->next;
    p->next = s->next;
    *e = s->data;//暂存
    free(s);
    printf("删除成功\n");
    return 0;
}

/**
 * @describe 查找操作
 * @param L:链表类型
 * @param e:e查找元素
 * */
int queryLinkL(SLinkListL L, int e) {
    printf("查找元素为:%d",e);
    SLinkListL p = L;
    int i = 1;
    while (p) {
        p = p->next;
        if (p->data == e) {
            printf("找到元素%d\n", i);
            return 0;
        }
        i++;
    }
    printf("下标不合法/没有找到该数据");
    return -1;
}

/**
 * @describe 修改操作
 * @param L:链表类型
 * @param i:修改元素的位置
 * @param e:修改元素值
 * */
int updataLinkL(SLinkListL &L, int pos, int e) {
    printf("修改数据为第:%d 个,值为:%d\n",pos,e);
    SLinkListL p = L;
    int i = 0;
    while (p && i < pos) {
        p = p->next;
        i++;
    }
    if (!p || i > pos) {
        printf("修改失败--原因:修改的下标越界\n");
        return -1;
    }
    p->data = e;
    printf("修改成功\n");
    return 0;
}

void printLL(SLinkListL L) {
    printf("打印全部数据\n");
    SLinkListL p = L->next;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

综上所述:只多了一个指针,一开始看估计还有有看不懂的地方,按照顺序把代码粘贴到你编辑器上,运行起来慢慢看。

原文地址:https://www.cnblogs.com/cmusketeer/p/9740789.html

时间: 2024-10-24 20:00:58

数据结构----线性表顺序和链式结构的使用(c)的相关文章

(源代码见大话数据结构)线性表—队列的链式存储结构-&gt;出队&amp;入队&amp;建立空队列

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 #define OVERFLOW 0 typedef int Status; typedef int QElemType; typedef struct QNode//标识符和类型名一样不知道什么用意.. { QElemType data; stru

数据结构之第二章线性表之静态链式存储

1--特点:用一维数组来描述线性表,用游标代替指针指示节点在数组中的相对位置.不设“指针”类型的高级语言中适用链表结构. 2--线性表的静态链式存储结构 ////  静态单链表.h//  单链表的静态存储//// 6 //  Copyright (c) 2014年 dashuai. All rights reserved.// #ifndef SLIST_H#define SLIST_H#include <stdio.h>#include <stdlib.h> #define MA

数据结构线性表顺序结构的实现

package com.he.list; import java.util.Arrays; import org.w3c.dom.ls.LSException; class ArrayList { private int length;// the list's length private int[] store;// store the data // initialize an empty list public ArrayList initList(String name) { retu

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

数据结构-线性表-顺序表

总括: 线性表是一种最简单的数据结构,线性表的主要操作特点是可以在任意位置插入和删除一个数据元素. 线性表可以用顺序存储结构和链式存储结构存储,用顺序存储结构实现的线性表称为顺序表,用链式存储结构实现线性表称为链表. 1,线性表概述: 线性表:线性表是一种可以在任意位置进行插入和删除数据元素操作的,有n个(n>=0)个相同类型数据元素a0,a1,. . .an组成的线性结构. 线性表抽象数据类型:抽象数据类型是指一个逻辑概念上的类型和这个类型上的操作集合:因此,线性表的抽象数据类型主要包括两个方

数据结构——线性表顺序表示(5)

题目来源于王道2018数据结构考研复习指导线性表的综合练习 编译环境:VS2015 题目:从顺序表中删除其值在给定s与t之间(包含s和t,要求s<t)的所有元素,如果s或t不合理或者顺序表为空,则显示出错信息并退出运行. 注意:这道题目与上一道有所不同.上一道题目所要求的表是有序表,而这道题则没要求,因此要考虑乱序的情况. 思路:举个例子,随意给一个顺序表的元素为{1,5,4,2,3,6},需要删除的数字区间是闭区间[2,5],计数变量j=0,记录在闭区间的数的个数 具体流程: i=0,  L.

基础数据结构-线性表-顺序表的合并操作

因为最近笔记本B面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言. 顺序表的合并操作 题目描述建立顺序表的类,属性包括:数组.实际长度.最大长度(设定为1000) 已知两个递增序列,把两个序列的数据合并到顺序表中,并使得顺序表的数据递增有序输入第1行先输入n表示有n个数据,接着输入n个数据,表示第1个序列,要求数据递增互不等 第2行先输入m表示有m个数据,接着输入m个数据,表示第2个序列,要求数据递增互不等输出顺序表内容包括顺序表的实际长度和数

(源代码见大话数据结构)线性表—循环队列的顺序存储结构

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int Status; typedef int QElemType; typedef struct { QElemType data[MAXSIZE]; int front; int rear; }SqQueue; Status In

数据结构(四)——基于链式存储结构的线性表

数据结构(四)--基于链式存储结构的线性表 一.基于链式存储结构的线性表 1.链式存储的定义 链式存储为了表示数据元素与其直接后继元素间的逻辑关系,数据元素除了存储本身的信息外,还需要存储直接后继的信息.相连的数据元素之间在存储空间中不要求连续.链式存储的逻辑结构基于链式存储结构的线性表中,每个结点都包含数据域和指针域.数据域用于存储数据元素本身,指针域用于存储相邻结点的地址. 2.链表的定义 链表是基于链式存储结构的线性表链表的基本元素:头结点:链表中的辅助结点,包含指向第一个数据元素的指针数