day1-双向链表

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

今天是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;
}

猜你喜欢

转载自blog.csdn.net/zhoucheng_123/article/details/107327791