查找: 指定位置处修改+指定位置处增加节点
顺序表和链表的优缺点比较::
顺序表优点:: 支持随机访问。
顺序表缺点:空间不够了 需要扩容 扩容是由消耗的 头部或者中间位置的插入删除 需要挪动 挪动数据也是有消耗的 避免频繁扩容 一次一般都是按倍数去扩的 可能存在一定的空间浪费
链表的优点:: 按需申请空间 不用了就释放空间
头部中间插入删除数据 不需要挪动数据
不存在空间浪费。
fun.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define SLndatatype int
typedef struct SListNode
{
SLndatatype a;
struct SListNode* next;
}SLN;
void PUSHback(SLN**p,SLndatatype aa);
void printfun(SLN *p);
void PUSHfront(SLN** p, SLndatatype aa);
void POPback(SLN** pplist);
void POPfront(SLN** pplist);
SLN* FondNode(SLN* pplist, SLndatatype aa);
fun.c
#include"fun.h"
void printfun(SLN* p)
{
SLN* pp = p;
while (pp != NULL)
{
printf("%d-> ", pp->a);
pp = pp->next;
}
printf("NULL\n");
}
SLN* NewNodeFun(SLndatatype aa)
{
SLN* newnode = (SLN*)malloc(sizeof(SLN));
newnode->next = NULL;
newnode->a = aa;
return newnode;
}
void PUSHback(SLN** p, SLndatatype aa)
{
SLN** pp = p;
SLN* NewNode = NewNodeFun(aa);
if (*p == NULL)
{
*p = NewNode;
}
else
{
//找到尾部节点;
SLN* tail = *pp;
while (tail->next!=NULL)
{
tail = tail->next;
}
tail->next = NewNode;
}
}
void PUSHfront(SLN** p, SLndatatype aa)
{
SLN** pp = p;
SLN* NewNode = NewNodeFun(aa);
if (*p == NULL)
{
*p = NewNode;
}
else
{
NewNode->next = *p;
*p = NewNode;
}
}
void POPback(SLN** pplist)
{
assert(*pplist != NULL);
if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
}
else
{
SLN* CUR = *pplist;
SLN* TMP = NULL;
while (CUR->next)//********
{
TMP = CUR;
CUR = CUR->next;
}
TMP->next = NULL;
free(CUR);
CUR = NULL;
}
}
void POPfront(SLN** pplist)
{
assert(*pplist != NULL);
//一个的情况
if ((*pplist)->next == NULL)
{
free(*pplist);
*pplist = NULL;
return;
}
//不止一个的情况:
else
{
SLN* TMP = NULL;
TMP = *pplist;
*pplist = (*pplist)->next;
free(TMP);
TMP = NULL;
}
}
SLN* FondNode(SLN* pplist, SLndatatype aa)
{
SLN* CUR = pplist;
while (CUR)
{
if (CUR->a != aa)
{
CUR = CUR->next;
}
else
{
return CUR;
}
}
return NULL;
test.c
#include"fun.h"
int main()
{
SLN *p=NULL;
PUSHback(&p,1);
printfun(p);
PUSHfront(&p, 2);
PUSHfront(&p, 2);
PUSHfront(&p, 2);
PUSHfront(&p, 2);
PUSHfront(&p, 5);
PUSHfront(&p, 3);
printfun(p);
POPback(&p);
POPback(&p);
POPback(&p);
printfun(p);
POPfront(&p);
printfun(p);
SLN*posS=FondNode(p, 2);
int i = 1;
while (posS)
{
printf("第%d个的地址是%p,值是%d\n", i++, posS, posS->a);
posS = FondNode(posS->next, 2);//下一次查找的起始地址:
}
system("pause");
return 0;
}