给定一个头指针,如何创建一个双向链表?

C语言实现
Creat函数,功能:给定头指针 建立一个双向链表
返回表头节点。

img

#include<stdio.h>
#define ElemType int

typedef struct Node
{
    ElemType data;      //数据域
    struct Node *prio;  //前驱结点指针域
    struct Node *next;  //后继结点指针域
} Node, *PNode;

//双链表管理结构
typedef struct List
{
    PNode first; //指向头结点
    PNode last; //指向尾结点
    int   size; //保存有效结点个数
} List;
//初始化双链表
void InitDList(List *list)
{
    //申请头结点
    Node *s = (Node *)malloc(sizeof(Node));
    //assert(s != NULL);
    //初始化时管理结点头指针和尾指针都指向头结点
    list->first = list->last = s;
    //头结点的前驱指针域和后继指针域都先赋值为空
    list->last->next = NULL;
    list->first->prio = NULL;
    //此时还没有有效结点
    list->size = 0;
}
//头插
//获取结点
Node* _buynode(ElemType x)
{
    //申请结点空间
    Node *s = (Node *)malloc(sizeof(Node));
    //assert(s != NULL);
    //为结点添加数据
    s->data = x;
    s->next = s->prio = NULL;
    return s;
}

//尾部插入
void push_back(List *list, ElemType x)
{
    //获取要插入的有效结点
    Node *s = _buynode(x);
    //该结点与前驱结点建立连接
    s->prio = list->last;
    //前驱结点与该结点建立连接
    list->last->next = s;
    //更新管理结点中尾指针域的指向
    list->last = s;
    //更新有效结点数
    list->size++;
}

//查看双链表内的所以数据
void show_list(List *list)
{
    //指向第一个有效结点
    Node *p = list->first->next;
    while(p != NULL)//将每个有效结点内的数据输出
    {
        printf("%d-->",p->data);
        p = p->next;
    }
    printf("Nul.\n");
}
void creat(List list)
{
    printf("输入节点个数:");
    int n,data;
    scanf("%d",&n);
    for(int j=0; j<n; j++)
    {
        scanf("%d",&data);
        ElemType tem=data;
        push_back(&list,tem);
    }
    show_list(&list);
}
int main()
{
    List list;
    InitDList(&list);
    creat(list);
    return 0;
}

主要代码:https://blog.csdn.net/qq_44075108/article/details/109125866


#include <stdio.h>
#include <stdlib.h>
//节点结构
typedef struct line{
    struct line * prior;
    int data;
    struct line * next;
}line;
//双链表的创建函数
line* initLine(line * head);
//输出双链表的函数
void display(line * head);

int main() {
    //创建一个头指针
    line * head=NULL;
    //调用链表创建函数
    head=initLine(head);
    //输出创建好的链表
    display(head);
    //显示双链表的优点
    printf("链表中第 4 个节点的直接前驱是:%d",head->next->next->next->prior->data);
    return 0;
}
line* initLine(line * head){
    //创建一个首元节点,链表的头指针为head
    head=(line*)malloc(sizeof(line));
    //对节点进行初始化
    head->prior=NULL;
    head->next=NULL;
    head->data=1;
    //声明一个指向首元节点的指针,方便后期向链表中添加新创建的节点
    line * list=head;
    for (int i=2; i<=5; i++) {
        //创建新的节点并初始化
        line * body=(line*)malloc(sizeof(line));
        body->prior=NULL;
        body->next=NULL;
        body->data=i;

        //新节点与链表最后一个节点建立关系
        list->next=body;
        body->prior=list;
        //list永远指向链表中最后一个节点
        list=list->next;
    }
    //返回新创建的链表
    return head;
}
void display(line * head){
    line * temp=head;
    while (temp) {
        //如果该节点无后继节点,说明此节点是链表的最后一个节点
        if (temp->next==NULL) {
            printf("%d\n",temp->data);
        }else{
            printf("%d <-> ",temp->data);
        }
        temp=temp->next;
    }
}
typename <T>
struct Node 
{
    T   data;      //数据域
    struct Node *p;  //前驱结点指针
    struct Node *n;  //后继结点指针
}