zoukankan      html  css  js  c++  java
  • 双向循环链表程序

    //dblist.h
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct tagDbNode
    {
     int data;
     struct tagDbNode * left;
     struct tagDbNode * right;
    } DbNode, * pdbNode;
    
    
    //创建结点
    pdbNode CreateNode(int data)
    {
     pdbNode pnode = (pdbNode)malloc(sizeof(DbNode));
     pnode->data = data;
     pnode->left = pnode->right = pnode; //创建新结点时,让其前驱和后继指针都指向自身
     
     return pnode;
    }
    
    //创建链表
    pdbNode CreateList(int head)  //参数给出表头结点数据 (表头结点不作为存放有意义数据的结点)
    {
     pdbNode pnode = (pdbNode)malloc(sizeof(DbNode));
     pnode->data = head;
     pnode->left = pnode->right = pnode; 
     return pnode;
    }
    
    //插入新结点,总是在表尾插入; 返回表头结点
    pdbNode InsertNode(pdbNode node, int data) // 参数1是链表的表头结点,参数2是要插入的结点(结
    
    点数据为data)
    {
     pdbNode pnode = CreateNode(data);
     
     // 从左到右恢复链接
     node->left->right = pnode;
     pnode->right = node;
     
     // 从右到左恢复链接
     pnode->left = node->left;
     node->left = pnode;
      
     return node;
    }
    
    //查找结点,成功则返回满足条件的结点指针,否则返回NULL
    pdbNode FindNode(pdbNode node, int data) // 参数1是链表的表头结点,参数2是要查找的结点(其中
    
    结点数据为data)
    {
     pdbNode pnode = node->right;
     while (pnode != node && pnode->data != data)
     {
      pnode = pnode->right;
     } 
     if (pnode == node)  return NULL; 
     return pnode;
    }
    
    //删除满足指定条件的结点, 返回表头结点, 删除失败返回NULL(失败的原因是不存在该结点)
    pdbNode DeleteNode(pdbNode node, int data) // 参数1是链表的表头结点,参数2是要删除的结点(其
    
    中结点数据为data)
    {
     pdbNode pnode = FindNode(node, data); 
     if (NULL == pnode) return NULL; 
     pnode->left->right=pnode->right;
     pnode->right->left=pnode->left;
     free(pnode); 
     return node;
    }
    
    //获取链表的长度
    int GetLength(pdbNode node) // 参数为链表的表头结点
    {
     int nCount = 0; 
     pdbNode pnode = node->right; 
     while (pnode!= node)
     {
         pnode = pnode->right;  
      nCount++;
     } 
     return nCount;
    }
    
    //顺序打印整个链表
    void PrintList(pdbNode node) // 参数为链表的表头结点
    {
     pdbNode pnode;
     if (NULL == node) return;
     pnode= node->right;
     while (pnode != node)
     {
      printf("%d   ", pnode->data);
      pnode = pnode ->right;
     } 
     printf("\n");
    }
    
    //将链表反序打印
    void ReverPrint(pdbNode node) //参数为链表的表头结点
    {
     pdbNode pnode;
     if (NULL == node) return; 
     pnode= node->left;
     while (pnode != node)
     {
      printf("%d   ", pnode->data);
      pnode = pnode->left;
     } 
     printf("\n");
    }
    
    //删除链表
    void DeleteList(pdbNode node) //参数为链表表头结点
    {
     pdbNode pnode = node->right;
     pdbNode ptmp;
     if (NULL == node) return; 
     
     while (pnode != node)
     {
      ptmp = pnode->right;
      free(pnode);
      pnode = ptmp;
     }
     free(node);
    }
    
    
    //测试程序
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "dblist.h"
    
    #define FALSE 0
    #define TRUE  1
    
    typedef unsigned int bool;
    
    void main()
    {
     int nChoose;
     int data;
     bool bFlag = FALSE;
     pdbNode pnode;
     pdbNode list = CreateList(0);
     
     while(bFlag == FALSE)
     {
      printf("Main Menu\n");
      printf("1.  Insert\n");
      printf("2.  Delete Node\n");
      printf("3.  Find\n");
      printf("4.  Length\n");
      printf("5.  Positive Print\n");
      printf("6.  Negative Print\n");
      printf("7.  Delete List\n");
      printf("0.  quit\n\n");
      
      scanf("%d", &nChoose);
      
      switch(nChoose)
      {
      case 1:
       printf("Input the data to insert:");
       scanf("%d", &data);
       list = InsertNode(list, data);
       PrintList(list);
       printf("\n");
       break;
      case 2: 
       printf("Input the data to delete: ");
       scanf("%d", &data);
       DeleteNode(list, data);
       PrintList(list);
       printf("\n");
       break;
      case 3:
       printf("Input the data to find: ");
       scanf("%d", &data);
       pnode = FindNode(list, data);
          if (NULL != pnode)
       {
        printf("Find succeed!\n");
     printf("\n");
       }
       else
       {
        printf("Find failed!\n");
     printf("\n");
       }
       break;
      case 4:
       printf("The list's length is %d\n", GetLength(list));
       printf("\n");
       break;
      case 5:
       PrintList(list);
       printf("\n");
       break;
      case 6:
       ReverPrint(list);
       printf("\n");
       break;
      case 7:
       DeleteList(list);
       printf("\n");
       break;
      case 0:
       DeleteList(list);
       bFlag = TRUE;
      }
     }
    }
  • 相关阅读:
    从零开始实现ASP.NET Core MVC的插件式开发(一)
    如何在C#中调试LINQ查询
    如何将Azure SQL 数据库还原到本地数据库实例中
    如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?
    使用Try.NET创建可交互.NET文档
    针对.NET Core, Xamarin以及.NET的自动类型安全Rest库: Refit
    C#中使用Bogus创建模拟数据
    如何在ASP.NET Core中使用Azure Service Bus Queue
    使用强类型实体Id来避免原始类型困扰(一)
    .NET中的状态机库Stateless
  • 原文地址:https://www.cnblogs.com/flash610/p/3080422.html
Copyright © 2011-2022 走看看