欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day1-双向链表

程序员文章站 2022-03-24 18:21:10
...

前言-学习数据结构与算法第一天

今天是2020年7月13日,今天开始学习数据结构与算法这门课程,之前好多立下的学习计划貌似都荒废了,这次可千万不能荒废啊,拜托了!
今天先学习一个简单的,双向链表,有单链表的基础,这双向链表也是学的比较快,基本原理搞懂了,代码跟单链表一样一样的。

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node *next,*pre;
}NODE;

void CreateList(NODE *head)
{
    NODE *p,*q;
    //p=(NODE *)malloc(sizeof(NODE));
    //步骤1,构造一个只有头节点的双向循环链表
    head->next=head;
    head->pre=head;
    p=head;
    while(1)
    {
        //新节点分配空间以及数据域的赋值
        q=(NODE *)malloc(sizeof(NODE));
        scanf("%d",&q->data);

        //当数据为0时,不再新建节点
        if(q->data==0)break;

        //双向连接
        q->next=head;
        q->pre=p;
        p->next=q;
        head->pre=q;

        //节点后移
        p=q;
    }
}

void print(NODE *h)
{
    NODE *p=h->next;
    while(p!=h)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

//在第i个元素之前插入元素
void insert(NODE *h,int n)
{
    int i=0;
    NODE *p=h->next,*q;
    q=(NODE *)malloc(sizeof(NODE));
    printf("请输入需要插入的元素:");
    scanf("%d",&q->data);
    while(p!=h)
    {
        i++;
        if(i==n)break;
        p=p->next;
    }

    //插入的顺序尤其需要注意
    //先处理新节点的指针域
    //被插入的两个指针域顺序不能乱
    q->next=p;
    q->pre=p->pre;
    p->pre->next=q;
    p->pre=q;
}

//删除第n个元素
void del(NODE *h)
{
    NODE *p=h->next;
    int i=0,n;
    printf("请输入想要删除第几个元素:");
    scanf("%d",&n);
    while(p!=h)
    {
        i++;
        if(i==n)break;
        p=p->next;
    }

    //看起来有点奇妙的代码,顺序乱了也没事
    p->pre->next=p->next;
    p->next->pre=p->pre;
}

//升序排列,单双链表差不多
void sortlist(NODE *h)
{
    NODE *p,*q;
    for(p=h->next;p!=h->pre;p=p->next)
    {
        for(q=p->next;q!=h;q=q->next)
        {
            if(p->data>q->data)
            {
                int t=p->data;
                p->data=q->data;
                q->data=t;
            }
        }
    }
}

int main()
{
    NODE *h;
    h=(NODE *)malloc(sizeof(NODE));
    CreateList(h);
    print(h);
    sortlist(h);
    print(h);
    return 0;
}