线性表

线性表的应用:将所有在线性表Lb中但不在线性表La中的元素插入线性表La #include<iostream> #include<stdio.h> #include <malloc.h> using namespace std; #define MaxSize 50 typedef char ElemType; typedef struct { ElemType elem[MaxSize]; //存放顺序表中 阅读详情

  这学期学数据结构,打算从现在开始就记笔记,不要向上学期学C语言一样,眼高手低,感觉总结以下比较好,虽然很基础,坚持下去。

顺序存储

  1. 优点:
    1. 用数组存储数据元素,物理位置上的相邻表示数据元素之间逻辑相邻
    2. 无须为表示节点间的逻辑关系而增加额外的存储开销
    3. 存储密度高
    4. 能随机地存取数据元素。
  2. 缺点:
    1. 在进行插入、删除时需要移动大量数据元素,运行效率低
    2. 而且需要预先分配存储空间,如果估计过大,容易造成存储空间浪费;如果估计过小,容易造成数据溢出。

链表的优缺点刚好与顺序表相反。

链式存储

常见操作

/*************************************************************************
    > File Name: 链表.c
    > Author: Tanswer_
    > Mail: 98duxm@gmail.com
    > Created Time: 2016年09月05日 星期一 21时01分57秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

struct Node
{
    int data;
    struct Node *next;
};

/*单链表创建*/
struct Node *Create()
{
    int x;
    struct Node *head,*r;
    head = (struct Node *)malloc(sizeof(struct Node));
    head -> next = NULL;

    scanf("%d",&x);
    while(x != -1)
    {
        r = (struct Node *)malloc(sizeof(struct Node ));

        r -> data = x;
        r -> next = head -> next;
        head -> next = r;

        scanf("%d",&x);
    }
    return head;
}

/*单链表逆置*/
struct Node *Reverse(struct Node *head)
{
    struct Node *p,*q;
    p = head -> next;
    head -> next = NULL;  //置为空

    while(p)
    {
        q = p;
        p = p -> next;
        q -> next = head -> next;
        head -> next = q;
    }
    return head;
}

/*删除重复节点*/
struct Node * pur_list(struct Node *head)
{
    struct Node *p,*q,*r;
    p = head -> next;
    if(p != NULL)
    while(p -> next != NULL)
    {
        q = p;
        while(q -> next != NULL)
        {
            if(q -> next -> data ==  p ->data)
            {
                r = q -> next;
                q -> next = r -> next;
                free(r);
            }
            else
                q = q -> next;
        }
        p = p -> next;
    }
    return head;
}

/*链表遍历*/
void Disply(struct Node *head)
{
    struct Node *r;
    r = head -> next;
    while(r != NULL)
    {
        printf("%d\n",r -> data);
        r = r -> next;
    }
}

int main()
{
    struct Node *h;
    h = Create();
    Disply(h);
    //h = Reverse(h);
    h = pur_list(h);
    Disply(h);
    return 0;
}

/***********************************************************************************
    > 问题描述
    > 编号为1,2,3...n的n个人按顺时针方向围坐在一张圆桌上,每人持有一个密码.
    > 开始任选一个正整数作为报数上限m,从第一个人开始按顺时针方向自1开始报数,
    > 报m的那个人出队,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,
    > 数到m的那个人出对,如此循环下去,直到所有人出队为止.
 **********************************************************************************/

/*************************************************************************
    > File Name: 约瑟夫环.c
    > Author: Tanswer_
    > Mail: 98duxm@gmail.com
    > Created Time: 2016年09月05日 星期一 22时04分21秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

struct Node 
{
    int     id;           //编号
    int     password;     //密码
    struct Node *next;
};

/*创建带有n个节点的循环链表*/
struct Node *Create(int n)
{
    int     i;
    int     ipassword;
    struct Node *head,*r,*s;

    head = (struct Node *)malloc(sizeof(struct Node));
    head -> next = NULL;
    s = head;
    for(i=1; i <= n; i++)
    {
        r = (struct Node *)malloc(sizeof(struct Node ));

        printf("请输入第%d个人的密码: ",i);
        scanf("%d",&ipassword);

        r -> id = i;
        r -> password = ipassword;

        r -> next = s -> next;
        s -> next = r;
        s = r;
    }
    s -> next = head -> next;
    return head;
}

/*打印循环链表*/
void printlist(struct Node *head)
{
    struct Node *pCur = head -> next;
    printf("--ID-- --PASSWORD--\n");
    do{
        printf("%3d %7d\n",pCur -> id,pCur -> password);
        pCur = pCur -> next;
    }while(pCur != head -> next);
}

/*运行约瑟夫环问题*/
void JosephusOperate(struct Node *head,int password)
{
    int     flag = 1;
    int     icounter = 0;
    struct Node *pDel,*pCur,*pPre;
    pPre = pCur = head -> next;

    while(pPre -> next != head -> next)
        pPre = pPre -> next;

    while(flag)
    {
        for(icounter=1; icounter<password; icounter++)
        {
            pPre = pCur;
            pCur = pCur -> next;
        }
        if(pPre == pCur) flag = 0;

        pDel = pCur;
        pPre -> next = pCur -> next;
        pCur = pCur -> next;
        password = pDel -> password;
        printf("第%d个人出列(密码:%d)\n",pDel -> id,pDel -> password);
        free(pDel);
    }
    head = NULL;
    getchar();
    getchar();
}

int main()
{
    int     n,m;
    struct Node *head;
    printf("请输入人数n: ");
    scanf("%d",&n);
    printf("请输入初始密码: ");
    scanf("%d",&m);
    head = Create(n);
    printf("\n-----打印循环链表-----\n");
    printlist(head);
    printf("\n-----打印出列情况-----\n");
    JosephusOperate(head,m);
    return 0;
}
C&C++线性表实训 第1关:顺序构建线性表 本关任务:按照数据输入的顺序构建一个线性表。即如果输入的3个结点数据分别为1、2、3,则构建的线性表包含3个结点,且从前往后的结点数据分别为1、2、3。 #include "linearList.h" node *insertTail(node *h, node *t) { if(h == NULL) // 空链表单独处理 { t->next = NULL; // 链表尾指针置为NULL return t; // 返回第一个结点 阅读详情

相关推荐

麒麟V10系统下微信PC版安装全攻略:从源配置到一键安装(附常见问题解决)

本文详细介绍了在麒麟V10系统下安装和优化微信PC版的完整流程,包括系统环境准备、软件源配置、多途径安装方案以及性能优化技巧。特别针对国产操作系统用户,提供了从基础安装到高级配置的一站式解决方案,并附有常见问题排查方法,帮助用户快速实现微信PC版的高效运行。

weixin_30500105的博客 712

Java,C实现约瑟夫环,一元多项式运算器

1 约瑟夫环问题描述:(初始密码为m) 约瑟夫环问题是循环链表的经典应用:具体描述如下:n 个人围成一个圆圈,首先第 1 个人从 1 开始一个人一个人顺时针报数,报到第 m 个人,令其出列。然后再从下一 个人开始从 1 顺时针报数,报到第 m 个人,再令其出列,…,如此下去,求出列顺序。 使用C实现 #include&lt;stdio.h&gt; #include&lt;stdlib.h&...

printfxgd的博客 323

【Matlab/simulink/carsim】再生制动

【Matlab/simulink/carsim】再生制动

weixin_62311849的博客 618

线性表概念_线性表的顺序表表示和实现_线性表的顺序存储

线性表基础概念,线性表的顺序表表示和实现 线性表 线性表(linear list)是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。 特征 线性表是具有相同特征的数据元素的一个有限序列。 线性表(linear list)由n(n>=0)个数据元素(结点)a1,a2,…,an组成的有限序列 线性表中元素的个数n(n...

diviner_s的博客 5097

AD24层次原理图设计避坑指南:如何解决端口连接与自动交叉引用问题

本文深入解析AD24层次原理图设计的核心机制,聚焦端口连接错误、自动交叉引用干扰等常见问题。通过对比自上而下与自下而上设计流程,提供端口类型匹配、命名规范等实用解决方案,并指导如何关闭烦人的红色框线视觉干扰,帮助工程师高效避坑,实现复杂系统的模块化设计。

wdx01234567的博客 615

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 617

C++线性表的基本操作

C++线性表的基本操作: 代码如下: #include<iostream> #include<stdlib.h> using namespace std; typedef int Elem; #define LIST_INST_SIZE 8 class List { public: List(int size);//构造函数 ~List();//析构函数,销毁 ...

weixin_43933077的博客 7113

Mac新手必看:nvm安装全攻略(含常见错误解决方案)

本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。

weixin_28839699的博客 1605

线性表的插入

#include <stdio.h> #include <stdlib.h> #define MAXSIZE 20 #define OK 1 #define ERRO 0 typedef int ElemType;//元素类型重命名 typedef int Status;//状态重命名 /*创建线性表结构体 ...

qq_37422050的博客 4628

Gröbner基方法入门第I部分:项序和约化

Gröbner基方法入门第I部分:项序和约化 理想的准素分解与矩阵分解是计算代数的核心问题,它们在计算机代数、计算代数几何、代数编码和密码学、多维系统理论等学科都有非常重要的理论意义与应用价值.Gröbner基理论是研究理想的准素分解与矩阵素分解的重要工具之一.更简单地概括:Gröbner基方法是从任意一个多项式理想的一组给定生成元,计算另一组性质良好的生成元,并称为该理想的Gröbner基.它能用来判定任意多项式是否属于该理想. Gröbner基的代数算法是Buchberger在1960年代开发的,并

MinCong Luo的博客 4258

谁在 SAP 系统里说了算:事务码 SCC4 与 SE06 的分工、优先级与实战管控

SAP系统通过SE06和SCC4两套机制控制变更权限:SE06作为系统级"总闸"管理跨Client对象修改,SCC4作为Client级"分闸"控制Client内配置变更。两者存在明确优先级,SE06的全局设置优先于SCC4。当SE06设为"不可修改"时,即使SCC4开放也无法更改跨Client对象。实际项目中需同时检查两处设置,并遵循"最小开放"原则进行变更管理。这种分层设计既满足日常维护需求,又能实现严格的变更管控。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 228

线性表的应用—线性表的合并

通过输入要取值的元素的位置来进行取值,并将取到的结果赋给同种变量类型e,在这里e同时也要使用引用传递,因为将取到的值赋给变量e后,e的值已经发生改变了。利用两个线性表LA和LB分别表示集合A和集合B,然后遍历线性表LB中的所有元素,将每一次遍历的元素取出,再和线性表LA中的元素逐一比较,如果线性表LA中。元素的查找要使用逐一对比,从第一个元素开始依次与传进的值e进行对比,如果相同,返回i+1,如果没有与传入元素相同的值,返回0,具体代码实现如下。线性表的展示直接利用循环,遍历输出线性表中元素的值即可。

m0_74472474的博客 1239

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

线性表的总结

一.线性表( Linear List )的定义:线性表是零个或多个具有相同类型的数据元素的有限序列。数据元素的个数定义为线性表的 长度 。长度等于零时称为空表,一个非空表通常记为 L = ( a 1 , a 2 ,……, a n ) 其中, a i ( 1 ≤ i ≤ n )称为数据元素,下标 i 表示该元素在线性表中的位置或序号, 称元素 a i 位于表的第 i 个位置,或称 a i 是表中的第...

hzcx777的博客 1282

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

线性表 (一) 线性表定义与线性表插入与删除

本文主要通俗地介绍了线性表的特征

qq_44639974的博客 1452

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

线性表代码

package 线性表和链表; //线性表 public class SqList<E> { private Object[]data;//存储数据元素 private int length;//线性表当前长度 private int maxSize;//数组长度 最大存储空间 public SqList(){ data=new Object[20]; length=0; //也可以直接使用 this(20)

梵高话葵 263

c语言两个线性表la lb,线性表La和线性表Lb合并

线性表La与Lb合并。输入:两个线性表La和Lb.过程:循环集合B中的每个元素,判断当前元素是否存在A中,若不存在,则插入到A中即可。输出:合并后的线性表La。代码如下#includeusing namespace std;#define MAXSIZE 100#define ElemType inttypedef struct{ElemType Data[MAXSIZE];int length;...

weixin_32752827的博客 3995

逆置线性表(线性表)

Problem A: 逆置线性表(线性表) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 228  Solved: 118 [Submit][Status][Web Board] Description (线性表)请写一个算法将顺序存储结构的线性表(a1...an)逆置为(an...a1)。 Input 输入长度n

u013629228的专栏 3994

JAVA数据结构——线性表

线性表是典型的数据结构之一,Java API支持多种数据结构,利用集合框架进行具体实现。本文将剖析这些数据结构是如何实现的。

NJfunkGiser的博客 880

三、【线性表】线性表概述

线性表概述 Linear List 在了解线性表之前,我们首先了解一下什么是线性结构。线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一的一个被称为“第一个”的数据元素;(2)存在唯一的一个被称为“最后一个”的数据元素;(3)除第一个外,集合中的每个数据元素均只有一个前驱;(4)除最后一个外,集合中的每个数据元素均只有一个后驱。 1 线性表的定义 线性表是一种最常用且最简单的数据结构。简单来说,一个线性表是nnn (n≥0)(n \ge 0)(n≥0) 个数据元素的有限序列,其中nnn为表长,

fujz123的博客 877
上一篇: 进程 写时复制 分页管理
下一篇: 【C++】入门基础概念
Tanswer_
博客等级 码龄11年 231粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值