推荐一个两学一做的网站,近期新闻大事,网站编程赚钱,网页设计有什么用单链表是我们学习数据结构时必不可少的部分#xff0c;但也由于指针的参与变得更加复杂#xff0c;这篇文章学习完之后可以更好地理解与掌握链表结构 注意#xff1a;
数据结构中#xff0c;不在乎菜单的创建#xff0c;注重的是功能的实现#xff1b;菜单的创建会影响我… 单链表是我们学习数据结构时必不可少的部分但也由于指针的参与变得更加复杂这篇文章学习完之后可以更好地理解与掌握链表结构 注意
数据结构中不在乎菜单的创建注重的是功能的实现菜单的创建会影响我们的调试 目录 结构体的创建动态申请节点打印尾插头插尾删头删链表查找链表插入某节点链表删除某节点 结构体的创建
这里要注意typedef的灵活使用可以更方便的使用与修改结构体不必牵一发而动全身
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;
}SListNode;动态申请节点
在我们前插或者尾插时需要一个新的结点故我们需要一个申请节点的函数帮助我们同时我们需要返回这个地址否则将会内存泄漏
SListNode* BuySListNode(SLTDateType x)
{SListNode* newnode (SListNode*)malloc(sizeof(SListNode));if (newnode NULL){perror(malloc);exit(-1);}newnode-data x;newnode-next NULL;return newnode;
}打印
打印可以很好的帮助我们检查我们写的程序有无错误
void SListPrint(SListNode* plist)
{SListNode* cur plist;while (cur){printf(%d-, cur-data);cur cur-next;}printf(NULL\n);
}尾插
单链表尾差与顺序表尾差完全不一样要知道单链表在创建头结点时SListNode* ps NULL; 我们发现创建的头结点是一个指针而我们尾插时如果是第一个元素就会改变ps的值而改变一个指针的值需要传入指针的地址故
void SListPushBack(SListNode** pplist, SLTDateType x)
//传入二级指针可以改变ps的值
{SListNode* newnode BuySListNode(x);if (*pplist NULL){*pplist newnode;}else{SListNode* cur *pplist;while (cur-next ! NULL){cur cur-next;}cur-next newnode;}
}头插
与尾插同理需要二级指针
void SListPushFront(SListNode** pplist, SLTDateType x)
{SListNode* newnode BuySListNode(x);newnode-next *pplist;*pplist newnode;
}尾删
void SListPopBack(SListNode** pplist)
{assert(*pplist);SListNode* cur *pplist;if (cur-next NULL){*pplist NULL;}else{while (cur-next-next ! NULL){cur cur-next;}free(cur-next);cur-next NULL;}
}头删
void SListPopFront(SListNode** pplist)
{assert(*pplist);SListNode* cur (*pplist)-next;free(*pplist);*pplist cur;
}链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{assert(plist);SListNode* cur plist;while (cur-next){if (cur-data x){return cur;}cur cur-next;}return NULL;
}(插入,删除与查找通常是配套使用
链表插入某节点
单链表插入时只能向后插入因为单链表只能找到后边的节点却无法找到前边的节点故链表的形态多种多样适用各种场景
void SListInsertAfter(SListNode* pos, SLTDateType x)
{SListNode* newnode BuySListNode(x);newnode-next pos-next;pos-next newnode;
}链表删除某节点
void SListEraseAfter(SListNode* pos)
{assert(pos-next);SListNode* cur pos;SListNode* tmp pos-next;cur-next cur-next-next;free(tmp);
}欢迎讨论有问题可以及时找我沟通每天25h高强度冲浪