链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针衔接次序,实现的一种线性存储结构。
链表由一系列节点组成,节点在运行时动态生成,每个节点包括两个部分: 存储数据元素的数据域 和 存储下一个节点地址的指针域。
#include “SList.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDataType;
typedef struct SListode
{
SLDataType data;
struct SLTNode* next;
}SLTNode;
尾插
void SLTpushBack(SLTNode** pphead,SLDataType x)
{
SLTNode* newnode=(SLTNode* pphead,SLDataType x);//建立一个新的节点
newnode->data=x;
newnode->next=NULL;
if(*pphead==NULL)//链表为空
{
*pphead=newnode;
}
else//链表不为空
{
SLTNode* tail=*pphead;//找尾
while(tail->next)
{
tail=tail->next;
}
tail->next=newnode;
}
头插
void SLTpushfront(SLTNode** pphead,SLDataType x)
{
SLTNode* newnode=(SLTNode*)malloc(sizeof(SLTNode));//建立一个新节点
newnode->data=x;
newnode->next=NULL;
newnode->next=*pphead;
*pphead=newnode;
}
尾删
void SLTpopback(SLTNode** pphead)//尾删
{
//找尾
SLTNode* tail=*pphead;//链表为空
assert(*pphead!=NULL);
if(*pphead->next==NULL)//链表有一个节点
{
free(*pphead);
*pphead=NULL;
}
else
{
SLTNode* prev=tail;
while(tail->next)
{
prev=tail;
tail=tail->next;
}
free(tail);
tail=NULL;//释放tail,同时也要将上一个节点的next值置零,
//防止其变成野指针,由于单链表是单向的,需定义新变量prev。
prev->next=NULL;
}
}
头删
void SListPopFront(SLTNode** pphead)
{
assert(*pphead!==NULL)//粗暴的方式
//if(*pphead==NULL)
// return;//温柔的方式
*pphead=*pphead->next;
free(*pphead);
SLTNode* next=(*pphead)->next;
free(*pphead);
*pphead=next;
}
查找
SLTNode* SListFind(SLTNode* pphead,SLDataType x)
{
SLTNode* cur= *pphead;
while(cur)
{
if(cur->data==x)
return cur;
else
{
cur=cur->next;
}
}
return NULL;
}
任意位置插入
void SListInsert(SLTNode** pphead,SLTNode* pos,SLDataType x);
{
SLTNode* newnode=(SLTNode*)malloc(SLTNode);//建立一个新结点
newnode->data=x;
newnode->next=NULL;
if(*pphead==pos)
{
newnode=*pphead;
newnode->next=pos;
}
else
{
//找到pos的前一个位置
SLTNode* posPrev=*pphead;
while(posPrev->next!=pos)//头插
{
posPrev=posPrev->next;
}
posPrev->next=newnode;
newnode->next=pos;
}
}