顺序表的问题及思考
问题:
思考:
如何解决以上问题呢?下面给出了链表的结构来看看
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
链表包括数据域和指针域:
数据结构中:
实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:
4. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结
构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
5. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了
代码如下:
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int SLTDateType;
typedef struct SListNode
{
SLTDateType data; //数据域
struct SListNode* next; //指针域
}SLTNode;
代码如下:
void SListPrint(SLTNode* plist)
{
assert(plist);
SLTNode* cur = plist;
while (cur !=NULL)
{
printf("%d--> ", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
代码如下:
SLTNode* BuyListNode(SLTDateType num) //创建一个结点
{
SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));
assert(node);
node->data = num;
node->next = NULL;
return node;
}
代码如下:
void SListPushBack(SLTNode** pplist, SLTDateType num) //尾部插入数据,会改变第一个结点,所以传二级指针
{
assert(pplist);
SLTNode* newnode = BuyListNode(num); //创建一个新结点
if (*pplist == NULL) //考虑当前一个结点都没有情况
{
*pplist = newnode;
}
else
{
SLTNode* tail = *pplist;
while (tail->next != NULL) //遍历找到尾结点
{
tail = tail->next;
}
tail->next = newnode; //把新结点的地址给前一个结点的指针
}
}
代码如下:
void SListPushFront(SLTNode** pplist, SLTDateType num)
{
assert(pplist);
SLTNode* newnode = BuyListNode(num);
newnode->next = *pplist;
*pplist = newnode;
}
代码如下:
void SListPopBack(SLTNode** pplist)
{
//1.没有结点
//2.1个结点
//3.多个结点
if (pplist == NULL)
{
return;
}
else if ((*pplist)->next == NULL)
{
free(pplist);
*pplist = NULL;
}
else
{
SLTNode* prev = NULL;
SLTNode* tail = *pplist;
while (tail->next != NULL)
{
prev = tail;
tail = tail->next;
}
free(tail);
tail = NULL;
prev->next = NULL;
}
}
代码如下:
void SListPopFront(SLTNode** pplist)
{
if (*pplist == NULL)
{
return;
}
else
{
SLTNode* next = (*pplist)->next;
free(*pplist);
*pplist = next;
}
}
代码如下:
SLTNode* SListFindKey(SLTNode* plist, SLTDateType num)
{
SLTNode* cur = plist;
while (cur != NULL)
{
if (cur->data == num)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
代码如下:
void SListInsertAfter(SLTNode* pos, SLTDateType num)
{
assert(pos);
SLTNode* newnode = BuyListNode(num);
newnode->next = pos->next;
pos->next = newnode;
}
代码如下:
void SListInsertBefore(SLTNode** pplist, SLTNode* pos, SLTDateType num)
{
assert(pos&&pplist);
SLTNode* newnode = BuyListNode(num);
if (pos == *pplist)
{
newnode->next = pos;
*pplist = newnode;
}
SLTNode* prev = NULL;
SLTNode* cur = pplist;
while (cur != pos)
{
prev = cur;
cur = cur->next;
}
prev->next = newnode;
newnode->next = pos;
}
代码如下:
void SListEarseAfter(SLTNode* pos)
{
assert(pos);
if (pos->next == NULL)
{
return;
}
else
{
SLTNode* cur = pos->next;
pos->next = cur->next;
}
}
以上就是今天要讲的内容,本文仅仅简单介绍了链表的各种方法的实现,而链表提供了方法能使我们快速便捷地处理数据的函数和方法,我们务必掌握。另外,如果有需要源码的私信我即可。还有,,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。
错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报...
正则忽略大小写 – RegexOptions.IgnoreCase 例如: 复制代码 代码如下: Str = R...
4月11日20:30~22:00通过腾讯会议进行了第二次在线学习讨论我把学习笔记整理一下...
上篇文章给大家介绍了 Java正则表达式匹配,替换,查找,切割的方法 ,接下来,...
本文实例讲述了Laravel框架源码解析之反射的使用。分享给大家供大家参考,具体如...
项目中用到的一些特殊字符和图标 html代码 XML/HTML Code 复制内容到剪贴板 div ...
Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特...
DELETEFROMTablesWHEREIDNOTIN(SELECTMin(ID)FROMTablesGROUPBYName) Min的话保...
工具:Eclipse,Oracle,smartupload.jar;语言:jsp,Java;数据存储:Oracle。...
复制代码 代码如下: % URL="http://news.163.com/special/00011K6L/rss_newstop....