zoukankan      html  css  js  c++  java
  • 双向链表操作-简单

    源程序:

    #include <stdio.h>

    #include <stdlib.h>

    //双向链表结点的定义

    typedef struct dbnode

    {

      int data;

      struct dbnode *prio, *next;

    }DbNode, linkdblist;

     //创建双向链表

     DbNode *creatlist(void)

     {

      linkdblist *p, *q, *head;

      q = p = (linkdblist *)malloc(sizeof(linkdblist));

      p->next = NULL;

      head = q;

      p = (linkdblist *)malloc(sizeof(linkdblist));

      scanf("%d", &p->data);

      while (p->data != -1)

      {

        q->next = p;

        p->prio = q;

        q = p;

        p = (linkdblist *)malloc(sizeof(linkdblist));

        scanf("%d", &p->data);

      }

      q->next = NULL;

       return head;

    }

    //输出双向链表

     void print(linkdblist *head)

    {

      linkdblist *p;

       p = head->next;

      if (p == NULL) 

      printf("空链表! ");

      while (p != NULL) 

      {

        printf("%d  ", p->data);

        p = p->next;

      }

    //向双向链表中的第i个位置插入一个结点x

     void insertdblist(linkdblist *head, int x, int i)

    {

      linkdblist *p, *q = head;

      if (i == 1) 

        q = head;

      else

      {

        q = q->next;

         int c = 1;   

        while ((c<i - 1) && (q != NULL))

        {

           q = q->next;

           c++;

         }

      }

      if (q != NULL && q->next != NULL) 

      {

        p = (linkdblist *)malloc(sizeof(linkdblist));

        p->data = x;

        p->prio = q;

         p->next = q->next;

        q->next = p;

        q->next->prio = p;

      }

      else

        printf("找不到插入的位置!");

    }

    //删除双向链表中指定位置上的一个结点

    void deletelinkdblist(linkdblist *head, int i)

    {

      linkdblist *p, *q = head;

      if (i == 1)

        q = head;

      else

      {

        q = q->next;

        int c = 1; 

        while (c < i - 1 && q != NULL) 

        { 

          q = q->next;

          c++ ;

        }

      }

      if (q != NULL && q->next != NULL)

      {

        p = q->next;

        p->prio = q;

        p->prio->next = p->next;

        p->next->prio = p->prio; 

        free(p);

      }

      else if (q->next == NULL)

      { 

        p = q;

         p->prio->next = NULL;

        free(p);

      }

      else

        printf("没有找到待删除的结点");

    }

    //双向链表的主函数

    void main()

      linkdblist *head; 

      head = creatlist(); 

      print(head);

      printf(" ====向双向链表的某位置插入一个值==== ");

      int num, i;

      printf("输入插入的位置:");

      scanf("%d", &i);

      printf(" 输入插入的值:"); 

      scanf("%d", &num); 

      insertdblist(head, num, i);

      print(head); 

      printf(" ");

      printf(" ====删除双向链表的某位置上的一个值==== "); 

      int j;

       printf("输入删除的位置:");

      scanf("%d", &j);

       deletelinkdblist(head, j);

      print(head); 

      system("pause");

      printf(" ");

    }

  • 相关阅读:
    SQL中使用WITH AS提高性能
    电子邮件原理
    DirectoryEntry 活动目录的使用
    Entity Framework 教程(转)
    用sp_addlinkedserver建立链接服务器(sql server2008中通过测试)
    SQL2008和SQL2000可以跨服务器连接查询的测试实例
    Linq快速入门——扩展方法
    easyui 很好很强大
    【转】Jmeter内存溢出处理方式记录
    【转】Jmeter安装成功后的目录介绍
  • 原文地址:https://www.cnblogs.com/duanqibo/p/11841263.html
Copyright © 2011-2022 走看看