做出链表 需要做出结构体
struct node
next 指向下一个结构体 node的指针
prev 指向上一个结构体 node的指针
data 用于保存数据 可以是基本类型 也可以是结构体
我们需要用到 来自 <stdlib.h>头文件的malloc函数 动态分配内存
malloc的使用
(指针)malloc(结构体大小) #前面括号是指针 #后面是大小
还有typedef 就是改名字 typedef struct mynode * node ; 意思是 node变量是结构体mynode的指针
创建链表 我们需要头节点 抓住头节点就可以找到下一个节点 对他增删改查
导入标准头文件
#include <stdio.h> #输入输出头文件
#include <stdlib.h> #动态分配内存的文件
#include <string.h>
struct mynode{ //结构体 node
int id; //编号 或者数据都行
struct mynode *prev; //上一个节点
struct mynode *next; //下一个节点
};
typedef struct mynode node ; //改名字 node = struct mynode
node *createlist() // 创建链表 就是创建头节点 并返回一个指向node 的指针
{
node *headnode = NULL; //定义头节点
headnode = (node *)malloc(sizeof(node)); //分配内存
headnode->id = 1; //定义id
headnode->next = NULL; //把下一个节点变成空节点
headnode->prev = NULL; //把上一个节点变成空节点
return headnode; //返回头节点
}
node *createnode(int data) //创建节点使用的函数
{
node *z_node = NULL; //定义变量 置为空
z_node = (node *)malloc(sizeof(node));
z_node->id = data;
z_node->next = NULL;
z_node->prev = NULL;
return z_node;
}
void printlist(node *headnode){ //打印链表的数据
node * s_node = headnode->next;
while(s_node){ //因为我们把下一个节点默认设置为空 null 了 所以while(null) 就退出了
printf("当前节点的id=%d\n",s_node->id); //打印节点的id 下一个id 上一个id
printf("下个节点的id=%d\n",s_node->next->id);
printf("上个节点的id=%d\n",s_node->prev->id);
printf("\n");
s_node = s_node->next; //赋值下一个节点给s_Node
if(s_node->next==NULL){
printf("当前节点的id=%d最后一个\n",s_node->id); //当他下一个节点是null时 就是最后一个节点了
break;
}
}
s_node = s_node->prev;
//while(s_node){
// printf("节点的%d\n",s_node->id);
// s_node = s_node->prev;
// printf("上一个\n");
//}
//printf("\n");
}
//插入节点,插入那个链表,插入节点的数据是多少
void insertnodebyhead(node * headnode,int data){ //头插法
//1.创建插入的节点
node * new_node = createnode(data); //创建节点
node * s_node = headnode->next; //取得头节点的下一个节点
new_node->prev = headnode; //新节点的上一个节点为头节点
headnode->next = new_node; //头节点的下一个节点是新节点
new_node->next = s_node; //新节点的下一个节点是原头节点的下一个节点
if(s_node!=NULL){
s_node->prev = new_node;
}
}
void appendnodebyhead(node * headnode,int data){ //尾插法 添加节点
//1.创建插入的节点
node * new_node = createnode(data);
node * s_node = headnode->next;
//printf("%d",s_node->id);
while(s_node){
//printf("%d",s_node->id);
s_node = s_node->next;
if(s_node->next==NULL)
break;
}
new_node->prev = s_node;
s_node->next = new_node;
new_node->next = NULL;
}
void deletenode(node * headnode,int position){ #删除节点
node * posnode = headnode->next;
node * posnodefront = headnode;
if(posnode==NULL){
printf("无法删除 列表为空\n");
}
else{
while(posnode->id!=position)
{
posnodefront = posnode;
posnode = posnodefront->next;
if(posnode == NULL){
printf("没有相关信息,无法删除");
break;
}
}
posnodefront->next = posnode->next;
free(posnode);
}
}
int main()
{
node *list = createlist();
insertnodebyhead(list,4); #头插4
insertnodebyhead(list,3); #头插3
insertnodebyhead(list,2); #头插2
appendnodebyhead(list,5); #尾插5
appendnodebyhead(list,6); #尾插6
appendnodebyhead(list,7); #尾插7
deletenode(list,2); #删除节点2
printf("头%d\n",list->id); #输出头节点
printlist(list); #输出剩余节点
return 0;
}
原文:https://www.cnblogs.com/hywhyme/p/11568883.html