ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

双向链表实现

2022-01-11 11:33:59  阅读:146  来源: 互联网

标签:head cur 实现 next 链表 双向 prev data DNode


#include<stdio.h>
#include<time.h>
typedef struct _DNode
{
    int data;
    struct _DNode* prev;
    struct _DNode* next;
}DNode;

DNode* CreateDNodeList()
{
    DNode* head=(DNode*)malloc(sizeof(DNode));
    if(NULL==head)
        exit(-1);
    head->next=head->prev=head;
    return head;
}

void InsertDNode(DNode* head,int data)
{
   DNode* cur=(DNode*)malloc(sizeof(DNode));
   if(NULL==cur)
       exit(-1);
   cur->data=data;
   cur->next=head->next;
   cur->prev=head;
   cur->prev->next=cur;
   cur->next->prev=cur;
}

int GetLen(DNode* head)
{
    DNode* tmp=head->next;
    int count=0;
    while(tmp->next!=head)
    {
        count++;
        tmp=tmp->next;
    }
    return count;
}

void TraverseDNodeList(DNode* head)
{
    DNode* cur=head;
    while(cur->next!=head)
    {
        printf("%d\t",cur->next->data);
        cur=cur->next;
    }
    printf("\n");
}

void DeleteDNode(DNode* pfind)
{
    pfind->prev->next=pfind->next;
    pfind->next->prev=pfind->prev;
    free(pfind);
}

void DestroyDNodeList(DNode* head)
{
    DNode* cur;
    while(head)
    {
        cur  = head;
        head = head->next;
        free(cur);
    }
}

void popSortDNodeList(DNode *head)
{
    DNode* p,*q,*cur;
    int    len = GetLen(head);
    for(int i=0;i<len-1;i++)
    {
        p=head->next;
        q=p->next;
        for(int j=0;j<len-1-i;j++)
        {
            if(p->data>q->data)
            {
                p->prev->next=q;
                p->next->prev=p->prev;
                p->next=q->next;
                p->prev=q;
                p->next->prev=p;
                p->prev->next=p;
                q=p->next;
                continue;
            }
            p=p->next;
            q=q->next;
        }
    }
}

DNode* SearchDNodeList(DNode *head,int data)
{
    DNode* clock=head->next,*unclock=head->prev;
    while(unclock!=clock->prev)
    {
        if(clock->data==data)
        return clock;
        if(unclock->data==data)
        return unclock;
        if(clock==unclock)
           break;
        clock=clock->next;
        unclock=unclock->prev;
    }
}

int main()
{
    DNode* head=CreateDNodeList();
    srand(time(NULL));
    //printf("随机插入十个元素:");
    for(int i=0;i<10;i++)
    {
        InsertDNode(head,rand()%10);
    }

    TraverseDNodeList(head);
    printf("操作说明:\n1.增加元素\n2.查找元素\n3.删除元素\n4.遍历双向链表\n5.销毁链表\n6.链表排序\n");

    int temp;
    while(1)
    {
        int num;
        printf("请输入操作\n");
        scanf("%d",&num);

    switch (num)
    {
    case 1:
        printf("请输入要添加的元素\n");
        scanf("%d",&temp);
        InsertDNode(head,temp);
        break;
    case 2:
        printf("请输入要查找的元素\n");
        scanf("%d",&temp);
        DNode* cur=SearchDNodeList(head,temp);
        if(cur)
        {
            printf("找到\n");
        }
        break;
    case 3:
        printf("请输入要删除的元素\n");
        scanf("%d",&temp);
        DNode* cur1=SearchDNodeList(head,temp);
        if(cur1)
        {
            DeleteDNode(cur1);
        }
        break;
    case 4:
        TraverseDNodeList(head);
        break;
    case 5:
        DestroyDNodeList(head);
        break;
    case 6:
        popSortDNodeList(head);
        break;
    }
    }



    return 0;
}

 

标签:head,cur,实现,next,链表,双向,prev,data,DNode
来源: https://www.cnblogs.com/SunShine-gzw/p/15787579.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有