一.定义
链表是由一系列节点组成,每个结点包含两个域,一个是数据域,数据域用来保存用户数据,另一个是指针域,保存下一个节点的地址。链表在内存中是非连续的。
二.分类
静态链表 动态链表
单向链表 双向链表 循环链表 单向循环链表 双向循环链表
三.链表的初始化,插入,遍历,销毁
#include<stdio.h>
#include<stdlib.h>
typedef struct Linknode
{
int data;
struct Linknode*next;
}Linknode;
//初始化链表,即创建第一个方块
Linknode* Init_Linknode()
{
//创建一个头指针
Linknode* header=(Linknode*)malloc(sizeof(Linknode));
header->data=0;
header->next=NULL;
//设置尾结点
Linknode* tail=header;//一开始让头指针等于尾指针
int value=1;
while(1){
printf("请输入数据");
scanf("%d",&value);
if(value==-1) break;
//创建新节点
Linknode* new=(Linknode*)malloc(sizeof(Linknode));
new->data=value;
new->next=NULL;
//把新节点插入到链表中去
tail->next=new;
//把新节点变成尾结点
tail=new;
}
return header;
}
//遍历链表
void Foreach_Linknode(Linknode* header)
{
if(header==NULL) return;
//辅助指针变量,指向头指针的next
Linknode* pCurrent=header->next;
while(pCurrent!=NULL){
printf("%d\n",pCurrent->data);
pCurrent=pCurrent->next;
}
}
//插入链表
void Insertvalue(Linknode* header,int oldvalue,int newvalue)
{
if(header==NULL) return;
Linknode* pPrv=header;
Linknode* pCurrent=pPrv->next;
while(pCurrent!=NULL){
if(pCurrent->data==oldvalue){
break;
}
pPrv=pCurrent;
pCurrent=pCurrent->next;
}
//如果pCurrent为空,说明链表中不存在oldvalue
if(pCurrent==NULL){
return;
}
//先创建新的结点
Linknode* newnode=(Linknode*)malloc(sizeof(Linknode));
newnode->data=newvalue;
newnode->next=NULL;
//新节点插入到链表中
newnode->next=pCurrent;
pPrv->next=newnode;
}
//清空
void ClearLinknode(Linknode* header)
{
if(header==NULL) return;
//辅助指针变量
Linknode* pCurrent=header->next;
while(pCurrent!=NULL){
//先保存当下一个节点的地址
Linknode* pNext=pCurrent->next;
//释放当前节点的内存
free(pCurrent);
//指向下一个结点
pCurrent=pNext;
header->next=NULL;
}
}
//删除值为value的结点
void RemoveLinknode(Linknode*node,int value)
{
if(node==NULL) return;
Linknode* pPrv=node;
Linknode* pCurrent=pPrv->next;
while (pCurrent!=NULL)
{
if(pCurrent->data==value){
break;
}
//移动辅助指针
pPrv=pCurrent;
pCurrent=pCurrent->next;
}
if(pCurrent==NULL){
return;
}
pPrv->next=pCurrent->next;
free(pCurrent);
pCurrent=NULL;
}
//销毁
void DestroyLinknode(Linknode* header)
{
if(header==NULL)
{
return;
}
Linknode* pCurrent=header;
while(pCurrent!=NULL){
Linknode* pNext=pCurrent->next;
//释放当前结点内存
free(pCurrent);
//结点向后移动
pCurrent=pNext;
}
}
int main(void)
{
Linknode* header=Init_Linknode();
Foreach_Linknode(header);
Insertvalue(header,300,666);
printf("________________________________");
Foreach_Linknode(header);
return 0;
}