怎么建设自己的购物网站,家装设计师自学攻略,郑州市新闻最新消息,logo设计竞标网站链表是线性表的一种#xff0c;是⼀种物理存储结构上⾮连续、⾮顺序的存储结构#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
和顺序表差不多#xff0c;用结构体定义一个节点#xff0c;包括存储的数据和下一个节点的地址。
这里我们写几个接口是⼀种物理存储结构上⾮连续、⾮顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
和顺序表差不多用结构体定义一个节点包括存储的数据和下一个节点的地址。
这里我们写几个接口尾插头插尾删头删查找元素指定位置插入指定位置删除销毁。
SList.h
#define _CRT_SECURE_NO_WARNINGS 1#includestdio.h
#includestdlib.h
#includeassert.htypedef int SList_Datatype;typedef struct SList_Node
{SList_Datatype Data;struct SList_Node* Next;
}STL_Node;void SLTPrint(STL_Node* phead);//尾插
void SLTPushBack(STL_Node** pphead, SList_Datatype x);
//头插
void SLTPushFront(STL_Node** pphead, SList_Datatype x);
//尾删
void SLTPopBack(STL_Node** pphead);
//头删
void SLTPopFront(STL_Node** pphead);//查找
STL_Node* SLTFind(STL_Node* phead, SList_Datatype x);//在指定位置之前插入数据
void SLTInsert(STL_Node** pphead, STL_Node* pos, SList_Datatype x);
//在指定位置之后插入数据
void SLTInsertAfter(STL_Node* pos, SList_Datatype x);//删除pos节点
void SLTErase(STL_Node** pphead, STL_Node* pos);
//删除pos之后的节点
void SLTEraseAfter(STL_Node* pos);//销毁链表
void SListDesTroy(STL_Node** pphead);
SList.c
打印
不改变实参传一级指针新建立一个头节点pur用while循环每次循环打印pur里面的数据并将pur-next赋给pur。以pur ! NULL为循环终止条件。
新建节点
创建一个newnode指针指向一个新开辟的节点将数据x放进data将next置空。
尾插
要改变实参传一个二级指针用新建节点函数新建一个newnode。这里分情况
1如果*pphead为空即这个链表没有节点就直接将newnode赋给pphead。
2这里要先找尾定义一个ptail指针首先指向*pphead之后用whlie循环进行找尾。将ptail-next指向newnode。
头插
头插比较简单因为不需要找尾传一个二级指针新建一个节点将newnode的next指向*pphead将*pphead指向newnode。就完成了头节点的替换。
尾删
传二级指针尾删和尾插差不多的只是在找尾的时候需要两个指针最后分别指向尾节点和尾节点的前一个节点。这里就不多叙述了。
头删
传二级指针新建一个指针指向第二个节点将第一个节点释放掉后将*pphead指向先前备份好的第二个节点。
查找元素
传一级指针新建一个指针指向phead循环遍历链表里面的数据得到结果返回相应节点的指针否则返回空指针。
在指定位置前/后插入数据
因为前插比较复杂这里只讲前插。
传二级指针先新建一个节点将数据放进去分两种情况
1pos为头指针这里直接调用头插的函数。
2pos不为头指针新建指针prev这里还是用while循环找pos前一个节点的指针循环结束条件为prev-next ! pos 、之后将prev的next指向新节点新节点的next指向pos
删除pos节点/删除pos之后的节点第二个我觉得没必要
这里讲第一个传二级指针分两种情况
1pos *pphead直接调用头插。
2pos *pphead新建指针prev用while循环找尾节点的前一个节点不多讲将prev的next指向pos的next此时pos就不在链表里面了只需要将它的空间释放掉将指针置空就ok了。
销毁链表
传二级指针用while在循环里面将当前*pphead指向的空间释放再将*pphead指向下一个节点结束条件为*pphead ! NULL循环结束后记得将*pphead置空这是个好习惯
下面参考代码附上
#define _CRT_SECURE_NO_WARNINGS 1
#includeSList.hvoid SLTPrint(STL_Node* phead)
{STL_Node* pur phead;while (pur){printf(%d-, pur-Data);pur pur-Next;}printf(NULL\n);
}STL_Node* SLTBuyNode(SList_Datatype x)
{STL_Node* newnode (STL_Node*)malloc(sizeof(STL_Node));if (newnode NULL){perror(malloc is fail!);exit(1);}newnode-Data x;newnode-Next NULL;return newnode;
}void SLTPushBack(STL_Node** pphead, SList_Datatype x)
{assert(pphead);STL_Node* newnode SLTBuyNode(x);if (*pphead NULL){*pphead newnode;}else{STL_Node* ptail *pphead;while (ptail-Next){ptail ptail-Next;}ptail-Next newnode;}
}void SLTPushFront(STL_Node** pphead, SList_Datatype x)
{assert(pphead);STL_Node* newnode SLTBuyNode(x);newnode-Next *pphead;*pphead newnode;
}void SLTPopBack(STL_Node** pphead)
{assert(pphead*pphead);if ((*pphead)-Next NULL){free(pphead);pphead NULL;}STL_Node* prve *pphead;STL_Node* ptail *pphead;while (ptail-Next){prve ptail;ptail ptail-Next;}free(ptail);ptail NULL;prve-Next NULL;
}void SLTPopFront(STL_Node** pphead)
{assert(pphead*pphead);STL_Node* tmp (*pphead)-Next;free(*pphead);*pphead tmp;
}STL_Node* SLTFind(STL_Node* phead, SList_Datatype x)
{STL_Node* pur phead;while (pur){if (pur-Data x){return pur;}pur pur-Next;}return NULL;
}
//在指定位置之前插入数据
void SLTInsert(STL_Node** pphead, STL_Node* pos, SList_Datatype x)
{assert(pphead*pphead);assert(pos);STL_Node* newnode SLTBuyNode(x);if (*pphead pos){SLTPushFront(pphead,x);free(newnode);newnode NULL;}else{STL_Node* prve *pphead;while (prve-Next ! pos){prve prve-Next;}prve-Next newnode;newnode-Next pos;}
}
//在指定位置之后插入数据
void SLTInsertAfter(STL_Node* pos, SList_Datatype x)
{assert(pos);STL_Node* newnode SLTBuyNode(x);newnode-Next pos-Next;pos-Next newnode;
}
//删除pos节点
void SLTErase(STL_Node** pphead, STL_Node* pos)
{assert(pphead*pphead);assert(pos);if (pos *pphead)SLTPopFront(pphead);else{STL_Node* prev *pphead;while (prev-Next ! pos){prev prev-Next;}prev-Next pos-Next;free(pos);pos NULL;}
}
//删除pos之后的节点
void SLTEraseAfter(STL_Node* pos)
{assert(pospos-Next);STL_Node* del pos-Next;pos-Next del-Next;free(del);del NULL;
}
//销毁链表
void SListDesTroy(STL_Node** pphead)
{assert(pphead *pphead);while (*pphead){STL_Node* next (*pphead)-Next;free(*pphead);*pphead next;}*pphead NULL;
}本期博客到这里就结束了如果有什么错误欢迎指出如果对你有帮助请点个赞谢谢