文章目录

  • 一、顺序表和链表的数据结构。
  • 二、最值
    • 2.1 使用顺序表
    • 2.2 使用链表
  • 三、逆置
    • 3.1 顺序表的逆置
    • 3.2 链表的逆置
  • 四、归并(前提:有序的表)
    • 4.1 顺序表实现归并有序表
    • 4.2 链表实现归并有序表

一、顺序表和链表的数据结构。

顺序表:

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>#define MaxSize 50
#define ElemType int
// 顺序表
typedef struct
{ElemType *data;int length;
}SqList;void InitList(SqList *&L,ElemType a[],int n)
{L = (SqList *)malloc(sizeof(SqList));//动态声明数组空间L->data = (ElemType *)malloc(sizeof(ElemType)*MaxSize);for (int i=0;i<n;i++)L->data[i]=a[i];L->length=n;
}//前插
bool ListInsert(SqList *&L, int i, ElemType e){//判断是否超过边界if(i < 1 || i > L->length + 1)return false;//判断数组有没有满if(L->length >= MaxSize)return false;//每个数据元素都往后移for(int j = L->length; j >= i; j--)L->data[j] = L->data[j-1];L->data[i-1] = e;L->length++;return true;
}//删除
bool ListDelete(SqList *&L, int i, ElemType &e){//判断是否超过边界if(i < 1 || i > L->length)return false;e = L->data[i-1];for(int j = i; j < L->length; j++)L->data[j-1] = L->data[j];L->length--;return true;
}//按值查找,返回顺序表的表号
int LocateElem(SqList L, ElemType e){int i;for(i = 0; i<L.length; i++){if(L.data[i] == e)return i+1;}return 0;//查找失败
}//打印顺序表
void printSqList(SqList L){for(int i = 0; i<L.length; i++){printf("%d ",L.data[i]);}
}void DestroyList(SqList *&L)
{free(L->data);free(L);
}

链表:

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>#define ElemType inttypedef struct LNode
{ElemType data;struct LNode *next;
} LinkNode; //头插法
void CreateListF(LinkNode *&L,ElemType a[],int n){L=(LinkNode *)malloc(sizeof(LinkNode));L->next=NULL;LinkNode *s;for(int i =0; i < n; i++){s=(LinkNode *)malloc(sizeof(LinkNode));s->data = a[i];s->next = L->next;L->next = s;}
}//尾插法
void CreateListR(LinkNode *&L,ElemType a[],int n){L=(LinkNode *)malloc(sizeof(LinkNode));L->next=NULL;LinkNode *s, *r;r = L;for(int i =0; i < n; i++){s=(LinkNode *)malloc(sizeof(LinkNode));s->data = a[i];s->next = r->next;r->next = s;r = r->next;}
}//按序号查找
LinkNode *GetElem(LinkNode *&L, int i){int j = 1;LinkNode *p = L;if(i == 0)return L;//返回头节点if(i<1)return NULL;while(p && j<i){ //p是否为NULL判断是否到链表尾p = p->next;j++;}return p;
}bool ListInsert(LinkNode *&L,int i,ElemType e)
{LinkNode* p = GetElem(L,i-1);//获取第i-1号节点if(p==NULL)return false;LinkNode *s;s->data = e;s->next = p->next;p->next = s;
}
bool ListDelete(LinkNode *&L,int i,ElemType &e)
{LinkNode* pre = GetElem(L,i-1);//获取第i-1号节点LinkNode* p = pre->next;//第i号if(pre == NULL)return false;e = p->data;pre->next = p->next;free(p);return true;
}
void DestroyList(LinkNode *&L)
{LinkNode *pre=L,*p=pre->next;while (p!=NULL){   free(pre);pre=p;p=pre->next;}free(pre);
}void DispList(LinkNode *L)
{LinkNode *p=L->next;while (p!=NULL){   printf("%d ",p->data);p=p->next;}printf("\n");
}

二、最值

给定L = {3,1,5,9,2},求其中的最大值,最小值

2.1 使用顺序表

//求数组最小值,最大值
void getMaxAndMin(SqList *&L, ElemType &_max, ElemType &_min){_max = _min = L->data[0];for(int i = 0; i < L->length; i++){if(L->data[i] >_max)_max = L->data[i];if(L->data[i] < _min)_min = L->data[i];}
}

2.2 使用链表

//求 最小值,最大值
void getMaxAndMin(LinkNode *&L, ElemType &_max, ElemType &_min){LinkNode *p = L->next;if(p==NULL)return;_max = _min = p->data;while(p!=NULL){if(p->data>_max)_max = p->data;if(p->data<_min)_min = p->data;p = p->next;}
}

三、逆置

L = {3,1,5,9,2},逆置后成{2,9,5,1,3}

3.1 顺序表的逆置

具体的思路为:用i和j代表数组两端的下标,然后对换L[i]和L[j],i++, j–,直到i>=j

//顺序表的逆置(从两边向中间靠,两边的元素互换)
void ListReverse(SqList *&L){int i = 0, j = L->length-1;while(i <= j){ElemType n = L->data[i];L->data[i] = L->data[j];L->data[j] = n;i++;j--;}
}

3.2 链表的逆置

将所有数据节点依次移动到尾节点之后:

//转置
void ListReverse(LinkNode *&L){LinkNode *r = L;// 将r设为尾节点while(r->next!=NULL){r = r->next; }LinkNode *p = L->next;while (L->next != r){//将p移动到r后方一位L->next = p->next;p->next = r->next;r->next = p;p = L->next;}
}

四、归并(前提:有序的表)

L1 = {1,2,3,5}, L2={4,6,7,8},合并两数组为L3={1,2,3,4,5,6,7,8}

4.1 顺序表实现归并有序表

首先假定输入的顺序表是有序的,对两个顺序表从头开始比较,将较小的元素插入新表种,然后往下遍历,直至所有元素都插入新表

//归并有序表(假定输入的两个顺序表都是有序的)
void ListMerge(SqList *&L1, SqList *&L2, SqList *&L3){int i =0 , j=0 , z= 0;//i为L1下标,j为L2下标,z为L3下标int len1 = L1->length;int len2 = L2->length;for(;i<len1 && j<len2; z++){if(L1->data[i] < L2->data[j])L3->data[z] = L1->data[i++];elseL3->data[z] = L2->data[j++];}while (i<len1){L3->data[z++] = L1->data[i++];}while (j<len2){L3->data[z++] = L2->data[j++];}L3->length = len1+len2;
}

4.2 链表实现归并有序表

void ListMerge(LinkNode *&L1, LinkNode *&L2, LinkNode *&L3){LinkNode *p1 = L1->next, *p2 = L2->next, *p3 = L3;for(;p1!=NULL && p2!=NULL;p3 = p3->next){if(p1->data<p2->data){LinkNode *temp = (LinkNode*)malloc(sizeof(LinkNode));temp->data = p1->data;p3->next = temp;temp->next = NULL;p1=p1->next;}else{LinkNode *temp = (LinkNode*)malloc(sizeof(LinkNode));temp->data = p2->data;p3->next = temp;temp->next = NULL;p2=p2->next;}}while (p1!=NULL)//L1还没全部插入L3{LinkNode *temp = (LinkNode*)malloc(sizeof(LinkNode));temp->data = p1->data;p3->next = temp;temp->next = NULL;p1 = p1->next;p3=p3->next;}while (p2!=NULL)//L1还没全部插入L3{LinkNode *temp = (LinkNode*)malloc(sizeof(LinkNode));temp->data = p2->data;p3->next = temp;temp->next = NULL;p2 = p2->next;p3=p3->next;}
}

5.顺序表和链表的最值,逆置和归并有序表相关推荐

  1. 链表基础操作及其逆置

    纠结了很久的一道链表题.果然我数据结构学得好渣.纠结了大约两个星期.最后提交作业的时间都截止了,还没交,再交的时候过期了,交不了了.只好跟老师说声,然后她又改了时间. 最后总结出了是我的指针和结构体学 ...

  2. 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现

    写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...

  3. 数据结构与算法:链表,队列,栈,递归,有序表

    反转单链表,双链表 import java.util.ArrayList; import java.util.List;public class ReverseList {public static ...

  4. EXCEL中两列合并成一列以及根据相同列的值将表中一列的值复制到另一张表中?

    今在做EXCEL时遇两问题,现和大家分享如下: 1.如何将表中两列值合并到一列,并按照一定的分隔符进行分割,公式如下: 假如:要将F和G的值 合并到H列并按逗号","隔开:  H1 ...

  5. C语言 链表的创建--打印--逆置--新增--删除--排序--释放

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string. ...

  6. 单链表的应用 就地逆置

    [问题描述]试实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,a3....an)逆置为(an...a3,a2,a1).    [分析]就地逆置就是不需要额外申请结点空间,只需要利用原 ...

  7. 链表的逆置,归并,拆分以及其他函数集合

    #include <stdio.h> #include <stdlib.h> struct node {int data;struct node *next; };struct ...

  8. 用C++实现单链表的创建、逆置和输出 的两种方法

    http://blog.csdn.net/lfeng_coding/article/details/47300563 题目描述:在已知单链表头节点的情况下,设计算法逆置单链表并输出 方法一:采用首先将 ...

  9. python实现带头结点的单链表的就地逆置_设头指针为head,编写算法实现带头结点单链表head的就地逆置...

    链表问题大全!!!刚出炉的还热乎呢!! #include #include typedef struct node { int nDate; struct node *pstnext; }Node; ...

最新文章

  1. 如何使用Jackson来反序列化对象数组
  2. python适合做后端开发吗-转行IT做后端开发,学python还是java?
  3. JDK5的一些新特性
  4. squashfs重打包和ubi重打包
  5. Nginx的rewrite之set指令
  6. 通过深度学习检测疟疾
  7. Vue-CLI 3.x 自动部署项目至服务器
  8. word度量单位无效_ABBYY FineReader 12的具体使用方法和word排版设置
  9. SQL SERVER 收缩数据库的命令
  10. 关于 Profile
  11. tiledmap 图块属性_cocos2dx[3.4](25)——瓦片地图TiledMap
  12. 大数据工程师简历_大数据毕业生简历该怎么写?
  13. 使用Foxmail添加outlook和gmail
  14. c语言分数乘法,武汉小学数学六年级
  15. 初学者-Python 网页爬取小说
  16. hdu 4826 Labyrinth
  17. 虚拟服务器zend optimizer,windows服务器配置Zend Optimizer方法-安装Zend Optimizer步骤-SEO优化-猴子技术宅...
  18. Python 程序员过中秋Python+pygame 制作拼图小游戏(附源码:5源码)
  19. 满功耗RTX 4060首选游戏本:华硕天选4新品开售
  20. android bitmap转nv21(YUV420SP)

热门文章

  1. java assert可以检查exception吗_PETCT检查可以排查大肠癌吗?
  2. python画50个图-python绘制多个子图的实例
  3. 学python可以从事什么工作-学Python能干什么工作?工作前景怎么样?
  4. python是干嘛的-python到底拿来干什么
  5. 学python有前途吗-三十岁了,从零开始学python还有前途吗?
  6. python入门-零基础 Python 入门
  7. python能做什么工作-谁适合学Python?学了Python可以做什么工作?
  8. 51—Nod 1384 全排列
  9. python直方图解释,请用Python详细解释二维直方图
  10. vue 实现表格循环滚动 vue-seamless-scroll插件的安装与使用