双向链表的操作

转载 2016年08月30日 14:32:44
/*双向链表的操作*/

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

typedef struct DoubleLinkList{
    int data;
    struct DoubleLinkList *pre;
    struct DoubleLinkList *next;
}DlinkList_Node;

/*建立双链表*/
DlinkList_Node* createDLink()
{
    DlinkList_Node *head,*p,*s;
    int x;
    head = (DlinkList_Node*)malloc(sizeof(DlinkList_Node));
    p = head;
    while(1)
    {
        printf("please inut the data: \n");
        scanf("%d",&x);
        if(x != 65535)
        {
            s = (DlinkList_Node*)malloc(sizeof(DlinkList_Node));
            s->data = x;
            s->pre = p;
            s->next = s;
            p = s;
        }
        else
        {
            printf("\n End of data input \n");

            break;
        }
    }
    p->next = NULL;
    head = head->next;
    head->pre = NULL;

    return head;
}

/*顺序反续打印链表*/
void printDLink(DlinkList_Node *head)
{
    DlinkList_Node *p,*s;
    p = head;
    printf("The positive output of two-way linked list : \n");
    while(p)
    {
        printf("%d",p->data);
        s = p;
        p = p->next;
    }
    printf("\n Reverse order output two-way linked list : \n");
    while(s)
    {
        printf("%d",s->data);
        s = s->pre;
    }
    printf("\n \n");
}

/*删除一个节点*/
DlinkList_Node* deleteDlinkList_Node(DlinkList_Node *head,int i)
{
    DlinkList_Node *p;
    p = head;
    if(p->data == i)
    {
        head = p->next;
        head->pre = NULL;
        free(p);

        return head;
    }
    while(p)
    {
        if(p->data == i)
        {
            p->pre->next = p->next;
            p->next->pre = p->pre;
            free(p);

            return head;
        }
        p = p->next;
    }
    printf("Did not find the data you want to delete \n");

    return head;
}

/*插入一个节点*/
DlinkList_Node* insertDinkList_Node(DlinkList_Node *head,int i)
{
    DlinkList_Node *p,*temp;
    p = head;
    temp = (DlinkList_Node*)malloc(sizeof(DlinkList_Node));
    temp->data = i;
    if(i<p->data)
    {
        head = temp;
        head->next = p;
        head->pre = NULL;
        p->pre = head;

        return head;
    }
    while(p != NULL && i > p->data)
    {
        p = p->next;
    }
    if(i < p->data)
    {
        temp->next = p;
        temp->pre = p->pre;
        p->pre->next = temp;
        p->pre = temp;

        return head;
    }
    else
    {
        p->next = temp;
        temp->pre = p;
        temp->next = NULL;

        return head;
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    DlinkList_Node *head;
    head = createDLink();
    printDLink(head);
    head = insertDinkList_Node(head,1012);
    head = deleteDlinkList_Node(head,1991);
    printDLink(head);

    return a.exec();
}

相关文章推荐

双向链表操作

  • 2014-10-28 11:22
  • 36KB
  • 下载

双向链表的基本操作

双向链表的很多操作和单链表是相同的,比如求长度的操作,查找元素的操作。不过有些操作是有一些区别的,如插入、删除元素。#include /*用到了srand函数,所以要有这个头文件*/ #includ...

双向链表的操作

双向链表的操作

#include using namespace std; //打印选项 void printTheSelect() { cout<<"\n1.初始化双向链表\n2.打印双向链表\n3.逆...

双向链表操作

C语言(数据结构) - 双向链表的基本操作

/*dlist.h*/ #ifndef DList_H #define DList_H typedef int Item; typedef struct N...

双向链表的建立,增加,删除操作

/*程序的版权和版本声明部分: *Copyright(c)2014,烟台大学计算机学院学生 *All rights reserved. *文件名称: *作者:田成琳 *完成日期:2014 年...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)