#include<stdio.h>
#include <stdlib.h>
struct LinkList
{
/* data */
int data;
struct LinkList *next;
};
//创建链表
struct LinkList *Init_LinkList(){
//创建一个头节点(空链表)
struct LinkList *header = malloc(sizeof(struct LinkList));
header->data = -1;
header->next = NULL;
//创建一个尾部指针,使该指针始终指向链表的最后一个元素
struct LinkList *pRear = header;
int val = -1;
while (1)
{
/* code */
printf("请输入数据:");
scanf("%d",&val);
if (val == -1)
{
/* code */
break;
}
//创建一个新节点
struct LinkList *newnode = malloc(sizeof(struct LinkList));
newnode->data = val;
newnode->next = NULL;
//将新节点newnode插入链表中
pRear->next = newnode;
//更新
pRear = newnode;
}
return header;
}
//打印链表
void Foreach_LinkList(struct LinkList *header){
if(header ==NULL){
return;
}
//定义一个辅助指针
struct LinkList *pCurrent = header->next;
while (pCurrent != NULL)
{
/* code */
printf("%d\n",pCurrent->data);
//把辅助指针后移
pCurrent = pCurrent->next;
}
}
//在oldval位置处插入一条数据newval
void InsertByValue_LinkList(struct LinkList *header,int oldval,int newval){
if (header == NULL)
{
/* code */
return;
}
//创建两个辅助指针
struct LinkList *pRev = header;
struct LinkList *pCurrent = pRev->next;
while (pCurrent !=NULL)
{
/* code */
if(pCurrent->data==oldval){
break;
}
pRev = pCurrent;
pCurrent = pCurrent->next;
}
if (pCurrent ==NULL)
{
return;
}
//创建一个新节点
struct LinkList *newnode = malloc(sizeof(struct LinkList));
newnode->data = newval;
newnode->next = NULL;
//将新节点插入链表中
newnode->next = pCurrent;
pRev->next = newnode;
}
//清空链表(只保留一个头部节点)
void Clear_LinkList(struct LinkList *header){
//先判断链表是否为空
if (header == NULL)
{
/* code */
return;
}
//创造一个辅助指针变量
struct LinkList *pCurrent = header->next;
while (pCurrent !=NULL)
{
/* code */
//创建一个辅助指针变量,用于存放即将删除的那一个节点的地址
struct LinkList *pNext = pCurrent->next;
//释放pCurrent当下指向的节点内存
free(pCurrent);
//移动辅助指针变量
pCurrent = pNext;
}
header->next = NULL;
}
//删除值为val的节点
void RemoveByValue_LinkList(struct LinkList *header,int val){
//header == NULL时,相当于链表不存在
if (header == NULL)
{
/* code */
return;
}
//创建两个辅助指针变量
struct LinkList *pPrev = header;
struct LinkList *pCurrent = pPrev->next;
while (pCurrent !=NULL)
{
/* code */
//true表示是在链表中找到了data为val的那个节点
//false表示在链表中没有找到data为val的那个节点
if (pCurrent->data == val)
{
/* code */
break;
}
//移动两个辅助变量指针
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
//没有在列表找到值为val的节点
if (pCurrent == NULL)
{
/* code */
return;
}
//重新建立删除节点的前驱与后继节点之间的关系
pPrev->next = pCurrent->next;
//释放节点内存
free(pCurrent);
// ??????????
pCurrent = NULL;
}
//销毁链表
void Destroy_LinkList(struct LinkList *header){
if (header == NULL)
{
/* code */
return;
}
//创建辅助指针变量
struct LinkList *pCurrent = header;
while (pCurrent != NULL)
{
/* code */
//先创建一个辅助指针变量 保存当前节点的下一个节点的地址
struct LinkList *pNext = pCurrent->next;
//释放当前节点内存
free(pCurrent);
//移动辅助变量的指针向后移动,到下一个节点
pCurrent = pNext;
}
}
int main(){
//创建节点,并形成链表.
struct LinkList *header = Init_LinkList();
printf("-------------");
//遍历链表
Foreach_LinkList(header);
printf("*************");
//在链表中插入数据
InsertByValue_LinkList(header,20,100);
printf("*************");
//插入之后再遍历一次
Foreach_LinkList(header);
//清空链表*********
Clear_LinkList(header);
//清空之后在遍历一遍
Foreach_LinkList(header);
//删除节点值为val的节点
RemoveByValue_LinkList(header,2);
//删除之后在遍历一遍
printf("删除之后,遍历之前");
Foreach_LinkList(header);
printf("删除之后,遍历之后");
//销毁链表
Destroy_LinkList(header);
Foreach_LinkList(header);
return 0;
}
C语言实现数据链表的简单操作
于 2022-07-06 17:39:48 首次发布