单项链表和多项链表
做出链表 需要做出结构体
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{ //结构体 nodeint id; //编号 或者数据都行struct mynode *prev; //上一个节点struct mynode *next; //下一个节点};typedef struct mynode node ; //改名字 node = struct mynodenode *createlist() // 创建链表 就是创建头节点 并返回一个指向node 的指针{ node *headnode = NULL; //定义头节点headnode = (node *)malloc(sizeof(node)); //分配内存headnode->id = 1; //定义idheadnode->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); #头插4insertnodebyhead(list,3); #头插3insertnodebyhead(list,2); #头插2appendnodebyhead(list,5); #尾插5appendnodebyhead(list,6); #尾插6appendnodebyhead(list,7); #尾插7deletenode(list,2); #删除节点2printf("头%d\n",list->id); #输出头节点printlist(list); #输出剩余节点return 0;}