链表:
//优点:
1. 按需申请空间,不用了就释放空间(更合理的使用了空间)
2. 头部中间插入删除数据,不需要挪动数据不存空间浪费
// 缺点:
1. 每个一个数据,都要存一个指针去链接后面数据节点
2. 不支持随机访问(用下标直接访问第i个)
tip:顺序表的优点就有:支持随机访问 (有些算法,需要结构支持随机访问,比如:二分查找、比如优化的快排等等)
// 打印
//打印
void SListPrint(SLTNode*phead)
{
SLTNode* cur=phead;
while(cur != NULL)
{
printf("%d->",cur->data);
cur=cur->next;
}
}
void TestSList1()
{
SLTNode* plist=NUlL;
SListPushBack(&plist,1);
SListPushBack(&plist,2);
SListPushBack(&plist,3);
SListPushBack(&plist,4);
SListPrint(plist);
}
//头插
//创建新
SLTNode* BuyListNode(SLTDataType x)
{
SLTNode* newnode=(SLTNode*) malloc(sizeof(SLTNode));
if(newnode==NULL)
{
printf("malloc fail\n");
exit(-1);
}
newnode->data=x;
newnode->next=NULL;
return newnode;
}
//头插
void SListPushFront(SLTNode** pphead,SLTDataType x)
{
SLTNode* newnode=BuyListNode(x);
newnode->next=*pphead;
*pphead=newnode;
}
//尾删
//尾删
void SListPopBack(SLTNode** pphead)
{
if(*pphead==NULL)
{
return;
}
//一个节点
//两个节点
if((*pphead)->next==NULL)
{
free(*pphead);
*pphead=NULL;
}
else
{
/*SLTNode* pre=NuLL;
SLTNode* tail=*pphead;
whiel(tail->next != NULL)
{
tail=NULL;
tail=tail->next;
}
free(tail);
tail=NULL;
pre->next=NULL;
*/
SLTNode* tail=*pphead;
whiel(tail->next->next != NULL)
{
tail=NULL;
tail=tail->next->next;
}
free(tail);
tail->next=NULL;
}
}
//头删
//头删
void SListPopFront(SLTNode** pphead)
{
if (*phead==NUll)
{
return;
}
else
{
SLTNode* next=*pphead->nxet;
free(*pphead);
*pphead=next;
}
}
// 查找
//查找
SLTNode* SListFInd(SLTNode* phead,SLTDatsTYpe x)
{
SLTNode*cur =phead;
while(cur !=NULL)
{
if(cur->data==x)
{
return cur;
}
else
{
cur=cur->next;
}
}
return NULL;
}
// 在pos位置之前去插入一个节点
// 在pos位置之前去插入一个节点
void SListInsert(SLTNode** pphead,SLTNode* pos,SLTDataType x)
{
SLTNode* newnode=BuyListNode(x);
if(*pphead==pos)
{
newnode->next=*pphead;
*pphead=newnode;
}
else
{
//找到pos的前一个位置
SLTNode* posPrev=*pphead;
while(popPrev->next != pos)
{
posPrev=pos->next;
posPrev->next=newnode;
newnode->next=pos;
}
}
}
单链表的缺陷还是很多的,单纯单链表增删查找的意义不大
1、很多题考查的都是单链表
2、单链表更多的是去更复杂度数据结构的子结构。eg:哈希桶、邻接表