链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表是有一个个节点连接在一起组成的链表首先就是创建节点
//链表节点的创建
struct LinkNode
{
int data;//数据域
struct LinkNode *next;//指针域
};
链表初始化 (初始化头结点,头结点十分重要)
struct LinkNode *Init_LinkNode()
{
struct LinkNode * header = (struct LinkNode *)malloc(sizeof(struct LinkNode));//创建头结点 在堆区分配相应的大小;
header->data = -1;//头结点的数据域一般置为-1
header->next = NULL;//指针域初始化
struct LinkNode *pRear = header;//定义一个对位指针指向头结点便于数据的插入
int var = -1;//定义一个var变量用于接收需要插入链表的数据
while(1)
{
printf("please input value\n");//提示输入数值
scanf("%d",&var);//输入要插入链表的数据 -1 输入结束
if( -1 == var )
{
printf("insert end!\n");
break;
}
//创建新的结点将收到的数据插入链表
struct LinkNode *newNode = (struct LinkNode *) = malloc(sizeof(struct LinNode));
newNode->data = var;//将收到的数据插入到新创建的数据里面
newNode->next = NULL;//新创建的结点的指针域置为NULL
//新结点创建成功后,将结点插入到链表中去;
pRear->next = newNode;//创建的结点放在pRear结点的next
pRear = newNode;//让pRear一直指向链表的最后一个结点
}
}
遍历节点输出打印每一个值
void Foreach_LinkList(struct LinkNode *header)
{
//判断头结点是否为空
if(NULL == header)
{
return;
}
struct LinkNode *pCurrent = header->next;//定义一个指针指向链表,便于遍历整个链表
while(pCurrent != NULL)
{
printf("%d\n",pCurrent->data);//输出对应节点的数据域值
pCurrent = pCurrent->next;//让指针指向下一个节点
}
}
清除链表的每一个节点
void clear_LinkList(struct LinkNode *header)
{
if(NULL == header)
{
return;
}
struct LinkNode *pCurrent = header->next;//定义一个节点用于指向要删除的节点的下一个节点
while(pCurrent != NULL)
{
struct LinkNode *pNext = pCurrent->next;//要释放pCurrent需要一个指针指向pCurrent的下一个节点
free(pCurrent);//释放节点
pCurrent = pNext;//让指针指向下一个要释放的节点
}
printf("free list over\n");//释放所有节点成功 打印输出提示
return;
}
插入新节点在某个节点后面
void InsertByValue_LinkList(struct LinkNode *header,int oldval,int newval)
{
//判断是否为空节点
if(NULL == header)
{
return ;
}
struct LinkNode *pPrev = header;
struct LinkNode *pCurrent = pPrev ->next;
//循环找到要插入节点的位置
while(pCurrent != NULL)
{
if(pCurrent->data == oldval)//找到了 跳出循环
{
pPrev = pCurrent;
pCurrent = pCurrent->next;
break;
}
pPrev = pCurrnt; //未找到,指针后移动
pCurrent = pCurrent->next;
}
if(pCurrent == NULL )
{
printf("未找到值为%d的节点\n",oldval);
return ;
}
struct LinkNode *newNode = (struct LinkNode *)malloc(sizoeof(struct LinkNode));//为插入的新节分配内存
newnode->data = newval;
newnode->next = NULL;
//将新的节点插入到固定节点后面
newNode->next = pCurrent;
newNode->next = newNode;
return ;
}
删除某个节点
//思想 :遍历整个链表 删除相应值的节点
void RemoveByValue_LinkList(struct LinkNode *header,int deval)
{
struct LinkNode *pRrev = header;
struct LinkNode *pCurrent = pPrev->next;
while(pCurrent != NULL)
{
if(pCurrent->data == deval)
{
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
if(NULL == pCurrent)
{
printf("没有找到要删除的节点\n");
return ;
}
pPrev->next = pCurrent->next;
free(pCurrent);
printf("删除成功\n");
}