数据结构顺序表和链表(超详细)

2023-11-02

 线性表:

线性表 linear list n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使
用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 ...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,
线性表在物理上存储时,通常以数组和链式结构的形式存储。

顺序表

概念及结构

  顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。
顺序表一般可以为: 

静态顺序表:使用定长数组存储元素。

 动态顺序表:使用动态开辟的数组存储。

 如果将一开始动态开辟的内存填满,则会进行扩容,

扩容分两种情况:

原地扩容:在已开辟的动态内存后进行判断,如果后方内存大小足够扩容到新定义的大小,则在之前开辟的内存后面加上一段,以达到新定义内存大小;

异地扩容:如果在已开辟的动态内存后进行判断,后方的大小不足以扩容到新定义的大小,则会在内存中寻找一块新的足够容纳新定义大小的空间,并将之前的数据拷贝到新空间,再释放之前定义的动态内存空间;

接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空
间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间
大小,所以下面我们实现动态顺序表。

typedef int SLDateType;

typedef struct SeqList
{
    SLDateType* a;//动态开辟的数组
    int size;    //数据个数
    int capacity;//容量空间大小
}SL;


//初始化
void SLInit(SL* ps);

//释放或销毁
void SLDestroy(SL* ps);

//显示或打印
void SLPrintf(SL* ps);

//尾插
void SLPushBack(SL* ps, SLDateType x);
//尾删
void SLPopBack(SL* ps);
//头插
void SLPushFront(SL* ps, SLDateType x);
//头删
void SLPopFront(SL* ps);

//扩容
void SLCheckDestroy(SL* ps);

//顺序表查找
int SLFind(SL* ps,int n);

// 顺序表在pos位置插入x
void SLInsert(SL* ps, int pos, SLDateType x);

// 顺序表删除pos位置的值
void SLErase(SL* ps, int pos);

//顺序表修改
void SLModify(SL* ps,int pos,SLDateType x);

#define _CRT_SECURE_NO_WARNINGS 1

#include "Sequence.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>


//初始化
void SLInit(SL* ps)
{
    ps->a = (SLDateType*)malloc(sizeof(SLDateType*)*4);
    if (ps->a == NULL)
    {
        perror("malloc failed");
        exit(-1);
    }
    ps->size = 0;
    ps->capacity = 4;
}


//释放或销毁
void SLDestroy(SL* ps)
{
    free(ps->a);
    ps->a = NULL;
    ps->capacity = ps->size = 0;
}


//显示或打印
void SLPrintf(SL* ps)
{
    int i = 0;
    for (i = 0; i < ps->size; i++)
    {
        printf("%d ", ps->a[i]);
    }
    printf("\n");
}

//扩容
void SLCheckDestroy(SL* ps)
{
    if (ps->size == ps->capacity)
    {
        SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * 2 * ps->capacity);
        if (tmp == NULL)
        {
            perror("realloc failed");
            exit(-1);
        }
        ps->a = tmp;
        ps->capacity *= 2;
    }
}


//尾插

void SLPushBack(SL* ps, SLDateType x)
{
    SLCheckDestroy(ps);

    //ps->a[ps->size] = x;
    //ps->size++;

    SLInsert(ps,ps->size,x);
}

//尾删

void SLPopBack(SL* ps)
{
    assert(ps);


    //温柔型
    //if (ps->size == 0)
    //{
    //    return;
    //}
    
    //暴力型
    //assert(ps->size > 0);

    //ps->size--;

    SLErase(ps, ps->size - 1);
}


//头插

void SLPushFront(SL* ps, SLDateType x)
{
    assert(ps);
    SLCheckDestroy(ps);


    //int i = 0;
    //for (i = 0; i < ps->size ; i++)
    //{
    //    ps->a[ps->size-i] = ps->a[ps->size - i -1];
    //}
    //ps->a[0] = x;
    //ps->size++;


    SLInsert(ps, 0, x);
}

//头删

void SLPopFront(SL* ps)
{
    //防止越界
    assert(ps->size > 0);

    //int i = 0;
    //for (i = 0; i < ps->size - 1; i++)
    //{
    //    ps->a[i] = ps->a[i+1];
    //}
    //ps->size--;

    SLErase(ps, 0);
}

//查找
int SLFind(SL* ps, int n)
{
    int i = 0;
    for (i = 0; i < ps->size; i++)
    {
        if (ps->a[i] == n)
        {
            return i;
        }
    }
    return -1;
}


// 顺序表在pos位置插入x

void SLInsert(SL* ps, int pos, SLDateType x)
{
    assert(ps);
    //=0相当于头插,=size等于尾插
    assert(pos >= 0 && pos <= ps->size);

    SLCheckDestroy(ps);

    int start = ps->size - 1 ;
    while (start >= pos)
    {
        ps->a[start + 1] = ps->a[start];
        start--;
    }
    ps->a[pos] = x;
    ps->size++;
}


// 顺序表删除pos位置的值

void SLErase(SL* ps, int pos)
{
    assert(ps);

    assert(pos >= 0 && pos < ps->size);

    int begin = pos + 1;
    while (begin < ps->size)
    {
        ps->a[begin - 1] = ps->a[begin];
        begin++;
    }
    ps->size--;
}

//顺序表修改
void SLModify(SL* ps, int pos, SLDateType x)
{
    assert(ps);
    assert(pos >= 0 && pos < ps->size);

    ps->a[pos];
}

 值得注意的是:

如果没有使用温柔型或者暴力型判断,可能会发生数组越界,但是一般情况下,编译器不会报错,因为编译器只在数组两天的特定位置放置了越界标记,需要触发才会报错,触发一般是在编译结束时到数组越界标记访问,此时越界了,但没有在此处赋值,也不会报错。

顺序表总结:

缺点:

1.头部和中部插入和删除效率不高O(n);

2.空间不足时,扩容有一定的消耗(尤其是异地扩容)如:开辟空间,拷贝,释放旧空间;

3.扩容逻辑,可能存在空间浪费(200个,但是只用110个)。

优点:

1.尾插尾删足够快;

2.下标的随机访问和修改。

链表

链表的概念及结构:

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表
中的指针链接次序实现的 。

特点:按需申请释放

逻辑上分析链表如图:

 值得注意:

1.上图,链式结构在逻辑上是连续的,在物理上不一定是连续的;

2.现实中的结点一般是在堆上申请;

3.堆上申请的空间,可能连续,也可能不连续。 

物理上分析链表如下: 

1.单向链表的实现:

// 1 、无头 + 单向 + 非循环链表增删查改实现
typedef int SLTDateType ;
typedef struct SListNode
{
SLTDateType data ;
struct SListNode * next ;
} SListNode ;
// 动态申请一个结点
SListNode * BuySListNode ( SLTDateType x );
// 单链表打印
void SListPrint ( SListNode * plist );
// 单链表尾插
void SListPushBack ( SListNode ** pplist , SLTDateType x );
// 单链表的头插
void SListPushFront ( SListNode ** pplist , SLTDateType x );
// 单链表的尾删
void SListPopBack ( SListNode ** pplist );
// 单链表头删
void SListPopFront ( SListNode ** pplist );
// 单链表查找
SListNode * SListFind ( SListNode * plist , SLTDateType x );
// 单链表在 pos 位置之后插入 x
// 分析思考为什么不在 pos位置之前插入?
void SListInsertAfter ( SListNode * pos , SLTDateType x );
// 单链表删除 pos 位置之后的值
// 分析思考为什么不删除 pos 位置?
void SListEraseAfter ( SListNode * pos );
//销毁
void SListDestory ( SListNode** phead );

 // 动态申请一个结点

SListNode* BuySListNode(SLDataType x)
{

	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}

 // 单链表打印

void SListPrint(SListNode* phead)
{
	SListNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}

 特别需要注意的是

 

 

上面两张图中,图一说明改变成员,要用成员的指针,

图二说明改变成员的指针,要用成员的指针的指针(二级指针) 

// 单链表尾插

void SListPushBack(SListNode** phead, SLDataType x)
{
	assert(phead);
	SListNode* newnode = BuySListNode(x);

	if (*phead == NULL)
	{
		// 改变的结构体的指针,所以要用二级指针
		*phead = newnode;
	}
	else
	{
		SListNode* tail = *phead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		// 改变的结构体,用结构体的指针即可
		tail->next = newnode;
	}

}

// 单链表的头插

void SListPushFront(SListNode** phead, SLDataType x)
{
	assert(phead);
	SListNode* newnode = BuySListNode(x);
	newnode->next = *phead;
	*phead = newnode;
}

// 单链表的尾删

void SListPopBack(SListNode** phead)
{
	assert(phead);
	//0个
	assert(*phead);

	//1个或以上
	if ((*phead)->next == NULL)
	{
		free(*phead);
		*phead = NULL;
	}
	else
	{
		SListNode* tail = *phead;
		while (tail->next->next)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
		
	}
}

// 单链表头删

void SListPopFront(SListNode** phead)
{
	assert(phead);
	assert(*phead);
	
	SListNode* newnode = (*phead)->next;
	free(*phead);
	*phead = newnode;
}

//查找

SListNode* SListFind(SListNode* phead, SLDataType x)
{
	SListNode* newnode = phead;
	while (newnode)
	{
		if (newnode->data == x)
		{
			return newnode;
		}
		
			newnode = newnode->next;
		
	}
	return NULL;
}

//在pos之后插入x 

void SListInsertAfter(SListNode* pos, SLDataType x)
{
	assert(pos);

	SListNode* newnode = BuySListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
	

}

//在pos之前插x

void SLTInsert(SListNode** phead, SListNode* pos, SLDataType x)
{
	assert(pos);
	//方法一
	if (pos == *phead)
	{
		SListPushFront(phead, x);
	}
	else
	{
		SListNode* tail = *phead;
		while (tail->next != pos)
		{
			tail = tail->next;
		}
		SListNode* newnode = BuySListNode(x);
		tail->next = newnode;
		newnode->next = pos;
	}
	
	//方法二
	//SListNode* tail = *phead;
	//while (newnode->next == NULL)
	//{ 
	//	if (*phead == pos)
	//	{
	//		newnode->next = tail;
	//		*phead = newnode;
	//	}
	//	if (tail->next == pos)
	//	{
	//		newnode->next = tail->next;
	//		tail->next = newnode;
	//	}
	//	else
	//	{
	//		tail = tail->next;
	//	}

	//}
}

// 删除pos位置

void SLTErase(SListNode** phead, SListNode* pos)
{
	assert(phead);
	assert(pos);
	SListNode* tail = *phead;
	if (*phead == pos)
	{
		SListPopFront(phead);
		//*phead = pos->next;
		//return;
	}
	while (tail->next != pos->next)
	{
		if (tail->next == pos)
		{
			tail->next = tail->next->next;
		}
		else
		{
			tail = tail->next;
		}
	}
	free(pos);
	//pos = NULL;//形参不改变实参,在调用外面置空
}

// 删除pos的后一个位置

void SLTEraseAfter(SListNode* pos)
{
	assert(pos);
	assert(pos->next);//如果pos没有下一个,报错

	
	SListNode* postNext = pos->next;
	pos->next = pos->next->next;
	free(postNext);
	postNext = NULL;
}

//销毁 

void SListDestory(SListNode** phead)
{
	assert(phead);

	SListNode* cur = *phead;
	while (cur)
	{
		SListNode* node = cur->next;
		free(cur);
		cur = node;
	}

	*phead = NULL;
}

 替换发删除:

下一个节点的值给pos,然后删除pos->next的节点。

2.双向链表的实现:

// 2 、带头 + 双向 + 循环链表增删查改实现
typedef int LTDataType ;
typedef struct ListNode
{
LTDataType _data ;
struct ListNode * next ;
struct ListNode * prev ;
} ListNode ;
// 创建返回链表的头结点 .
ListNode * ListCreate ();
// 双向链表销毁
void ListDestory ( ListNode * plist );
// 双向链表打印
void ListPrint ( ListNode * plist );
// 双向链表尾插
void ListPushBack ( ListNode * plist , LTDataType x );
// 双向链表尾删
void ListPopBack ( ListNode * plist );
// 双向链表头插
void ListPushFront ( ListNode * plist , LTDataType x );
// 双向链表头删
void ListPopFront ( ListNode * plist );
// 双向链表查找
ListNode * ListFind ( ListNode * plist , LTDataType x );
// 双向链表在 pos 的前面进行插入
void ListInsert ( ListNode * pos , LTDataType x );
// 双向链表删除 pos 位置的结点
void ListErase ( ListNode * pos );

 // 创建返回链表的头结点

ListNode* BuyLTNode(LTDataType x)
{
	ListNode* node = (ListNode*)malloc(sizeof(ListNode));
	if (node == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	node->data = x;
	node->next = NULL;
	node->prev = NULL;

	return node;
}


// 创建返回链表的头结点.
ListNode* ListCreate()
{
	ListNode* head = BuyLTNode(0);
	head->next = head;
	head->prev = head;
	return head;
}

// 双向链表打印

// 双向链表打印
void ListPrint(ListNode* pHead)
{
	assert(pHead);
	ListNode* node = pHead->next;
	while (node != pHead)
	{
		printf("%d->",node->data);
		node = node->next;
	}
	printf("NULL\n");
}

// 双向链表在pos的前面进行插入

// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x)
{
	assert(pos);
	ListNode* newnode = BuyLTNode(x);
	ListNode* oldnode = pos->prev;
	newnode->prev = oldnode;
	oldnode->next = newnode;
	newnode->next = pos;
	pos->prev = newnode;

}

// 双向链表删除pos位置的节点

// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{
	assert(pos);
	ListNode* oldnode = pos->prev;
	oldnode->next = pos->next;
	pos->next->prev = oldnode;
	free(pos);
}

// 双向链表尾插

// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{
	assert(pHead);
	ListInsert(pHead,x);
}

// 双向链表头插

// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{
	assert(pHead);
	ListInsert(pHead->next,x);
}

// 双向链表尾删

// 双向链表尾删
void ListPopBack(ListNode* pHead)
{
	assert(pHead);
	//
	assert(pHead->next != pHead);
	ListErase(pHead->prev);
}

// 双向链表头删

// 双向链表头删
void ListPopFront(ListNode* pHead)
{
	assert(pHead);
	//
	assert(pHead->next != pHead);
	ListErase(pHead->next);
}

// 双向链表查找

// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
	assert(pHead);
	ListNode* node = pHead->next;
	while(node != pHead)
	{
		if (node->data == x)
		{
			return node;
		}
		node = node->next;
	}
	return NULL;
}

// 双向链表销毁

// 双向链表销毁
void ListDestory(ListNode* pHead)
{
	assert(pHead);
	ListNode* oldnode = pHead->next;
	while (oldnode != pHead)
	{
		ListNode* oldnode1 = oldnode->next;
		free(oldnode);
		oldnode = oldnode1;
	}
	free(pHead);
	printf("销毁完成!\n");
}

链表和顺序表的区别: 

缓存利用率:

 以上就是个人学习线性表的个人见解和学习的解析,欢迎各位大佬在评论区探讨!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连! 

                                             

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构顺序表和链表(超详细) 的相关文章

  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names

随机推荐

  • 低功耗蓝牙MESH基础知识

    一 MESH VS 点对点 大多数蓝牙低功耗设备使用一对一简单点对点网络拓扑结构来进行相互间的通信 在蓝牙核心规格中 这称为 微微网 想象一下 智能手机已经建立了与心率监测仪的点对点连接 并可借此传输数据 同样的智能手机也可以建立与其他设备
  • gettimeofday 获取毫秒时间溢出问题

    之前为了测试C中代码执行消耗的时间 所以写了这么一个函数 long long getmstime timeval tv gettimeofday tv NULL return tv tv sec 1000 tv tv usec 1000 之
  • 使用Hutool向第三方的接口发起请求

    使用Hutool工具请求第三方接口遇到的一篮子问题 1 请求第三方接口的几种方式 1 1 使用HttpUtil请求 返回String类型的JSON串 一般用在请求普通的页面情况下 返回的结果是JSON格式 但是如果出现了404 504错误
  • newInstance过时

    在今天使用反射的newInstance 时候发现 jdk9版本将class newInstance 过时 Class stack1 Class forName Stack Stack stack2 Stack stack1 getConst
  • leetcode 300. Longest Increasing Subsequence

    leetcode 300 Longest Increasing Subsequence 题目 Given an unsorted array of integers find the length of longest increasing
  • PHP中小型民宿酒店管理系统源码

    PHP中小型民宿酒店管理系统源码 近年来 民宿酒店行业以其独特的住宿体验和个性化服务受到越来越多旅行者的青睐 为了提高运营效率 改善客户体验 许多中小型民宿酒店开始引入管理系统 本文将介绍一款基于PHP开发的中小型民宿酒店管理系统源码 帮助
  • Axure动态布局,中部加入滚动条

    1 将部件设置为动态面板 然后再部件属性和样式中使用按需显示纵向滚动条 2 可以很好的处理因为内部页面过大挤占低端内容的问题
  • 解决Excel打开CSV文件中文乱码问题

    CSV打开乱码的处理方法 方法一 Excel的数据导入功能 方法二 CSV打开乱码的处理方法 CSV是用UTF 8编码的 而EXCEL是ANSI编码 由于编码方式不一致导致出现乱码 明白了原因之后 我们只需要把CSV文件的编码方式修改成与E
  • 第5章 数组 第3题

    题目 编写一个程序 输入一个字符串 输出其中每个字符在字母表中的序号 对于不是英文字母的字符 输出0 例如 输入为 acbf8g 输出为1 3 2 6 0 7 代码 include
  • 基础练习—矩阵乘法

    题目描述 给定一个N阶矩阵A 输出A的M次幂 M是非负整数 例如 A 1 2 3 4 A的2次幂 7 10 15 22 输入 第一行是一个正整数N M 1 lt N lt 30 0 lt M lt 5 表示矩阵A的阶数和要求的幂数 接下来N
  • excel或txt格式坐标到面图层(python)

    背景 现有如下图所示的多个界址点坐标 excel格式或txt格式 需求 根据大量界址点坐标转换为界址点坐标对应的面shp图层 解决思路 一 为方便处理首先将txt文件或excel文件转换为csv文件 逗号分割符 二 为方便理解和使用 我们将
  • python numpy的学习

    0 引入numpy import numpy as np 1 将list变成np a 1 2 3 4 5 6 b np array a 将list变成array a shape 2 3 2行3列 a shape 0 2 获取行数 a sha
  • 攻防世界之WEB新手练习区(更新至11)

    攻防世界之WEB新手练习区 目录 001 view source 002 get post 003robots 004backup 005cookie 006disable button 007simple js 008xff refere
  • FTDI FT2232H在嵌入式教学中的应用

    FT2232H是FTDI chip在2012年发布的一款高速USB转串行通信的协议转换芯片 作为第五代USB协议转串行总线通信协议的芯片 完全符合USB2 0规范 480Mb s 并且可以依靠编程的方式配置成为串行或者并行的其他总线接口规范
  • Pycharm无法正常安装第三方库的时候,有以下几条应对方法

    1 首先检查自己的环境变量是否配置正确 点击setting 点击 Python Interpreter 点击Add Interpreter 配置完毕之后再试一次从这里下载 如果还不行的话可以换其他方法 2 从cmd或Pycharm Term
  • 什么是EL表达式

    EL表达式 expression language 即表达语言 它是为了便于存取数据而定义的一种语言 JSP2 0之后才成为一种标准 形式 以 开头 以 结尾 通过PAGE指令来说明是否支持EL表达式 具体举例 声明可以使用EL表达式 如果
  • 【腾讯云 TDSQL-C Serverless 产品测评】全面测评TDSQL-C Mysql Serverless

    全面测评TDSQL C Mysql Serverless 文章目录 全面测评TDSQL C Mysql Serverless 前言 什么是TDSQL C Mysql Serverless 初始化 TDSQL C Mysql Serverle
  • 前车之覆,后车之鉴——开源项目经验谈

    前车之覆 后车之鉴 开源项目经验谈 本文发表于 程序员 2005年第2期 随着开源文化的日益普及 参与开源 似乎也变成了一种时尚 一时间 似乎大家都乐于把自己的代码拿出来分享了 就在新年前夕 我的一位老朋友 一位向来对开源嗤之以鼻的J2EE
  • 毕设 ssd tf_gpu2 predict.py 备份代码

    如图 代码所属 https github com bubbliiiing ssd tf2 怕到时候改坏了 unbelievable 不是 import time import cv2 import numpy as np import te
  • 数据结构顺序表和链表(超详细)

    线性表 线性表 linear list 是 n 个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使 用的数据结构 常见的线性表 顺序表 链表 栈 队列 字符串 线性表在逻辑上是线性结构 也就说是连续的一条直线 但是在物理结构上并