博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构----链表
阅读量:5167 次
发布时间:2019-06-13

本文共 3002 字,大约阅读时间需要 10 分钟。

单项链表和多项链表

做出链表 需要做出结构体

 

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

你可能感兴趣的文章
gcc/g++实战之动态链接库与静态链接库编写
查看>>
MSCRM 2011 JavaScript 开发文档
查看>>
[CF][差分标记]
查看>>
【学习笔记】动态规划—各种 DP 优化
查看>>
http 缓存相关
查看>>
安装第三方库出现 Python version 2.7 required, which was not found in the registry
查看>>
娓娓道来c指针 (4)解析c的声明语句
查看>>
【Linux导论】Linux文件系统基础(Linux Filesystem Basics)
查看>>
python脚本后台运行
查看>>
函数和方法
查看>>
最全36种python设计模式
查看>>
LINUX常用命令 --- 权限篇
查看>>
h5c3 part1
查看>>
十年未变!安全,谁之责?(上)
查看>>
(oralce)pga_aggregate_target与workarea_size_policy相互关系验证
查看>>
BZOJ1098: [POI2007]办公楼biu
查看>>
grid 布局 属性示例
查看>>
js Object.defineProperty 使用
查看>>
用C#实现Base64处理,加密解密,编码解码
查看>>
2-2点阵格式图像
查看>>