数据结构----链表

单项链表和多项链表

做出链表 需要做出结构体

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 ",s_node->id);              //打印节点的id      下一个id         上一个id
    printf("下个节点的id=%d ",s_node->next->id);  
    printf("上个节点的id=%d ",s_node->prev->id);
    printf(" ");
    s_node = s_node->next;                                                //赋值下一个节点给s_Node
    if(s_node->next==NULL){                                                  
    printf("当前节点的id=%d最后一个 ",s_node->id);      //当他下一个节点是null时             就是最后一个节点了
    break;
}
}
s_node = s_node->prev;                             
//while(s_node){
// printf("节点的%d ",s_node->id);
// s_node = s_node->prev;
// printf("上一个 ");
//}

//printf(" ");
}


//插入节点,插入那个链表,插入节点的数据是多少
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("无法删除 列表为空 ");
}
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 ",list->id);           #输出头节点
printlist(list);                           #输出剩余节点
return 0;
}

原文地址:https://www.cnblogs.com/hywhyme/p/11568883.html