链表
struct LinkNode{
int data;
struct LinkNode *next;
};
struct LinkNode *Construct_NewNode();
struct LinkNode *Init_Linklist();
void Foreach_LinkList(struct LinkNode *header);
void InsertByValue_Linklist(struct LinkNode *header,int olddata,int newdata);
void Clear_LinkList(struct LinkNode *header);
void RemoveByValue_LinkList(struct LinkNode *header,int deldata);
void Destroy_LinkList(struct LinkNode *header);
//创建新节点
struct LinkNode *Construct_NewNode(){
struct LinkNode *newnode=malloc(sizeof(struct LinkNode))
newnode->data=-1
newnode->next=NULL
return newnode
}
//初始化链表
struct LinkNode *Init_Linklist(){
//创建头节点
struct LinkNode *header=Construct_NewNode()
//创建尾部指针
struct LinkNode *pRear=header
//插入节点
int value=-1
while(true){
scanf("%d",&value)
if(value==-1){
break
}
//创建新节点
struct LinkNode *newnode=Construct_NewNode()
newnode->data=value
//新节点插入到链表中
pRear->next=newnode
//更新尾部指针指向
pRear=newcode
}
return header
}
//遍历输出链表
void Foreach_LinkList(struct LinkNode *header){
if(header==NULL){
return
}
//设置辅助指针变量
struct LinkNode *pcurrent=header->next
while(pcurrent){
printf("%d",pcurrent->data)
pcurrent=pcurrent->next
}
}
//在链表中的olddata处插入节点(若没有olddata就在链表最末尾插入)
void InsertByValue_Linklist(struct LinkNode *header,int olddata,int newdata){
if(header==NULL){
return
}
//设置两个辅助指针变量
struct LinkNode *pPrev=header
struct LinkNode *pCurrent=pPrev->next
while(pCurrent){
if(pCurrent->data==olddata){
break
}
//移动两个辅助指针
pPrev=pCurrent
pCurrent=pCurrent->next
}
//如果pCurrent为空,说明链表中不存在值为olddata的节点
//if(pCurrent==NULL){
//return
//}
//创建新节点
struct LinkNode *newnode=Construct_NewNode()
newnode->data=newdata
//新节点插入到链表中
newnode->next=pCurrent
pPrev->next=newnode
}
//清空(只剩一个头节点)
void Clear_LinkList(struct LinkNode *header){
if(header==NULL){
return
}
//设置辅助指针变量
struct LinkNode *pCurrent=header->next
while(pCurrent){
//先保存下个节点地址
struct LinkNode *pNext=pCurrent->next
//释放当前节点内容
free(pCurrent)
//pCurrent指向下一个节点
pCurrent=pnext
}
header->next=NULL
}
//在链表中删除节点
void RemoveByValue_LinkList(struct LinkNode *header,int deldata){
if(header==NULL){
return
}
//设置两个辅助指针变量
struct LinkNode *pPrev=header
struct LinkNode *pCurrent=pPrev->next
while(pCurrent){
if(pCurrent->data==deldata){
break
}
//移动两个辅助指针
pPrev=pCurrent
pCurrent=pCurrent->next
}
if(pCurrent==NULL){
return
}
//重新建立待删除节点的前驱和后继节点关系
pPrev->next=pCurrent->next
//释放待删除节点内存
free(pCurrent)
}
//销毁(与清空链表相似,清空留下一个头节点,销毁把头节点也删除了)
void Destroy_LinkList(struct LinkNode *header){
if(header==NULL){
return
}
//设置辅助指针变量
struct LinkNode *pCurrent=header
while(pCurrent){
//先保存下个节点地址
struct LinkNode *pNext=pCurrent->next
//释放当前节点内容
free(pCurrent)
//pCurrent指向下一个节点
pCurrent=pNext
}
}