一.定义
链表是由一系列节点组成,每个结点包含两个域,一个是数据域,数据域用来保存用户数据,另一个是指针域,保存下一个节点的地址。链表在内存中是非连续的。
二.分类
静态链表 动态链表
单向链表 双向链表 循环链表 单向循环链表 双向循环链表
三.链表的初始化,插入,遍历,销毁
#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;//辅助指针变量,指向头指针的nextLinknode* 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为空,说明链表中不存在oldvalueif(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;
}