当前位置: 首页 > news >正文

双链表各种操作实现(数据结构C语言多文件编写)

1.先创建list.h声明文件( Linux 命令:touch list.h)。编写函数声明如下(打开文件 Linux 操作命令:vim list.h):

//双链表的头文件
#ifndef __LIST_H__
#define __LIST_H__
//节点
typedef struct node{int data;//数据struct node* next;struct node* prev;
}node_t;
//链表
typedef struct list{node_t head;//头结点//无论是指针变量还是普通变量都可以node_t tail;//尾节点
}list_t;
//链表的初始化
//list_t list list,head list.tail
void listInit(list_t* l);
//链表的释放
void listDeinit(list_t* l);
//头部插入
void listInsertHead(list_t* l,int data);
//尾部插入
void listInsertTail(list_t* l,int data);
//顺序插入
void listInsert(list_t* l,int data);
//删除节点
void listDel(list_t* l,int data);
//遍历链表
void listTravel(list_t* l);
#endif //__LIST_H__

2.创建函数实现文件list.c( Linux 命令:touch list.c)。写入函数到文件中:

//链表的实现
#include<stdio.h>
#include"list.h"
#include<stdlib.h>//链表的初始化
void listInit(list_t* l){//处理后指针//头结点的后指针 指向 尾节点l->head.next=&l->tail;//->的优先级高//尾节点的后指针指向 空l->tail.next=NULL;//处理前指针//尾节点的前指针 指向 头节点l->tail.prev=&l->head;//头结点的前指针 指向 空l->head.prev=NULL;//头为节点存无效数字0l->head.data=0;l->tail.data=0;
}
//链表的释放
void listDeinit(list_t* l){while(l->head.next!=&l->tail){//first 指向头结点node_t* first=&l->head;node_t* mid=first->next;node_t* last=mid->next;//连接前后两个节点//将后面节点的地址 存入 前面节点的next指针中first->next=last;//将前面节点的地址 存入 后面节点的prev指针中last->prev=first;//释放mid指向的中间节点free(mid);}
}
//头部插入
void listInsertHead(list_t* l,int data){node_t* new=malloc(sizeof(node_t));new->data=0;new->prev=NULL;new->next=NULL;node_t* mid=&l->head;node_t* last=mid->next;mid->next=new;new->next=last;new->prev=mid;last->prev=new;
}
//尾部插入
void listInsertTail(list_t* l,int data){//创建新节点node_t* new=malloc(sizeof(node_t));new->data=data;new->next=NULL;new->prev=NULL;//将新节点插入到尾节点之前node_t* last=&l->tail;//尾节点node_t* mid=last->prev;//最后一个有效节点//将新节点得地址 存入 最后一个有效节点里的next指针中mid->next=new;//j将尾节点的地址 存入 新节点的next指针中new->next=last;//将新节点的地址 存入 尾节点的prev指针中last->prev=new;//将最后一个有效节点的地址 存入新节点的prev指针中new->prev=mid;
}
//顺序插入
void listInsert(list_t* l,int data){//创建新节点node_t* new=malloc(sizeof(node_t));new->data=data;new->next=NULL;new->prev=NULL;//确定位置,插入新节点for(node_t* p=&l->head;p!=&l->tail;p=p->next){node_t* first=p;node_t* mid=first->next;if(mid->data>new->data||mid==&l->tail){//将新节点插入在first和mid指向的节点中间位置//将新节点的地址存入 前面节点的next指针中first->next=new;//将后面节点的地址 存入 新节点的next指针中new->next=mid;//将新节点的地址存入 后面节点的prev指针中mid->prev=new;//将前面节点的地址 存入 新节点的prev指针中new->prev=first;break;}}}
//删除节点
void listDel(list_t* l,int data){for(node_t* p=&l->head;p!=&l->tail;p=p->next){node_t* first=p;node_t* mid=first->next;node_t* last=mid->next;//mid指向要删除的节点if(mid->data==data){//连接前后两个节点//将后面节点的地址存入 到前面节点的next指针中first->next=last;//将前面节点的地址 存入 后面节点的prev指针中last->prev=first;//释放中间节点free(mid);break;}//如果mid指向尾节点,说明没有找到要删除得节点if(mid==&l->tail){printf("节点不存在\n");break;}
}
}
//遍历链表
void listTravel(list_t* l){printf("从前向后:");for(node_t* p=l->head.next;p!=&l->tail;p=p->next){printf("%d ",p->data);}printf("\n");printf("从后向前:");for(node_t* p=l->tail.prev;p!=&l->head;p=p->prev){printf("%d ",p->data);}printf("\n");
}

3.编写主函数调用文件main.c(Linux命令:touch main.c)。编写逻辑操作:

//链表的使用
#include<stdio.h>
#include"list.h"
int main(void){list_t list;//初始化listInit(&list);//顺序插入listInsert(&list,40);listInsert(&list,50);listInsert(&list,20);listInsert(&list,440);listInsert(&list,67);listInsert(&list,27);//尾部插入listInsertTail(&list,90);listInsertTail(&list,100);//遍历listTravel(&list);//删除listDel(&list,100);listDel(&list,20);listDel(&list,50);//释放listDeinit(&list);return 0;
}

4.编译运行

Linux命令:gcc main.c queue.c -o queue

                运行:./queue

相关文章:

  • QT中多线程写法
  • 摄影测量——单像空间后方交会
  • AI知识补全(十六):A2A - 谷歌开源的agent通信协议是什么?
  • 集成学习介绍
  • 【YOLOv8改进 - 特征融合】EFC: 基于增强层间特征关联的轻量级即插即用融合策略,即插即用适,用于小目标检测
  • AIP-233 批量方法:Create
  • 中和农信的“三农”服务密码:科技+标准化助力乡村振兴
  • React中 点击事件写法 的注意(this、箭头函数)
  • 【React】基本语法
  • 浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek音乐创作最强玩法来了!
  • python: audioFlux XXCC 提取梅尔频率倒谱系数 MFCC
  • day30 第八章 贪心算法 part04
  • 阳台光伏 “WiFi” 电表:开启智慧能源新纪元/出海欧标认证!
  • 2025高频面试算法总结篇【动态规划】
  • Spark-SQL核心编程:DataFrame、DataSet与RDD深度解析
  • leetcode:1351. 统计有序矩阵中的负数(python3解法)
  • SQL学习笔记-聚合查询
  • 16:00开始面试,16:08就出来了,问的问题有点变态。。。
  • 大数据学习栈记——MongoDB编程
  • 【Web三十一】K8S的常用命令
  • 浙江公开征集涉企行政执法问题线索,包括乱收费、乱罚款等
  • 河南洛阳新安县煤渣倾倒耕地:多年难恢复,为何至今未解决?
  • 中国科协发声:屡禁不止的奇葩论文再次敲响学风建设警钟
  • 比尔·盖茨:未来20年通过盖茨基金会捐出几乎全部财富,2045年底基金会停止运营
  • 盖茨:20年内将捐出几乎全部财富,盖茨基金会2045年关闭
  • 山寨“小米”智能马桶、花洒销售额过亿,被判赔3500万元