zoukankan      html  css  js  c++  java
  • 双链表的初始化,建立,插入,查找,删除。

    ---

    原创:http://www.cnblogs.com/newwy/archive/2010/10/10/1847458.html

    ////////////////////////////////////////////
    //双链表的初始化,建立,插入,查找,删除。//
    //Author:Wang Yong                        //    
    //Date: 2010.8.19                         //
    ////////////////////////////////////////////
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef int ElemType;
    ////////////////////////////////////////////
     
    // 定义双链表结点类型
     
    typedef struct Node
    {
        ElemType data;
        struct Node *prior;         //指向前驱结点 
        struct Node *next;          //指向后继结点 
    }Node, *DLinkList;
     
    ////////////////////////////////////////////
     
    //双链表的建立,采用尾插法建立双链表 
    DLinkList DLinkListCreatT()
    {
        Node *L,*p,*r;
        L = (Node *)malloc(sizeof(Node));//申请头结点
        L->next = NULL;
        r = L;
        r->next = NULL;                          //r 为指向终端结点的指针 
        ElemType x;
        while(scanf("%d",&x) != EOF)    //输入双链表元素,建立双链表
        {
            p = (Node *)malloc(sizeof(Node));
            p->data = x;
            p->next = r->next;
            r->next = p;
            r = p;
        }
        r->next = NULL; 
        return L;
    }
     
    /////////////////////////////////////////
     
    //双链表的查找,查找元素为x的位置
     
    int DLinkListFind(DLinkList L,ElemType x)
    {
        DLinkList p;                //p为检索, 
        p = L->next;
        int i = 1;
        while(p != NULL && p->data != x )//寻找值为x的元素**注意这里循环的条件不能写反 
        {                               //原因,当p == NULL 时候 p->data 会出错
            ++i;                        //  for (i = 1, p = L->next; p; p = p->next, i++) {
                                        //  if (p->data == x) break;}
            p = p->next;
        }
         
        if(p == NULL)               //如果没找到返回0 
            return 0;
        else return i;              //如果找到返回i 
    }
    /////////////////////////////////////////
     
    //双链表的插入,在双链表中的第i个位置插入值为x的元素
     
    DLinkList DLinkListInsert(DLinkList L,int i,ElemType x)
    {
        DLinkList p,s;                          //s为要插入的结点 
        p = L->next;                         //从第一个结点位置开始查找 
        int tempi;
        for(tempi = 1;tempi < i-1; tempi++)
            p = p->next;
        s = (Node *)malloc(sizeof(Node));
        s->data = x;                         //将x赋值到s的数据域 
        s->next = p->next;                        //将结点插入 
        p->next->prior = s;
        s->prior = p;
        p->next = s;
         
        return L;
          
    } 
     
    //////////////////////////////////////////////
     
    //双链表的删除,删除双链表中第i个结点
     
    DLinkList DLinkListDelete(DLinkList L,int i)
    {
        int tempi = 1;
        DLinkList p;                        //p为查找结点。 
        p = L->next;
        while((tempi++) != i && p != NULL)
        {
            p = p->next;
        }
        if(p == NULL)                       //检查是不是在双链表中的位置 
            printf("位置不合法。
    ");
        else if(p->next == NULL)         //最后一个结点特殊处理,原因最后一个结点p->next没有prior  
        {
            p->prior->next = NULL;
            free(p);
        } 
        else                                //进行删除操作 
        { 
            p->prior->next = p->next;
            p->next->prior = p->prior;
            free(p); 
        }
    } 
     
    /////////////////////////////////////////// 
    int main()
    {
        DLinkList list,start;
        list = DLinkListCreatT();
        for(start = list->next; start != NULL; start = start->next)
            printf("%d ",start->data);
        printf("
    ");
        int i;
        ElemType x;
        printf("请输入要查找元素的值:");
        scanf("%d",&x);
        i = DLinkListFind(list,x);
        if(i)
            printf("在链表中的位置为:%d
    ",i);
        else
            printf("没有这个元素。
    ");
        printf("请输入插入位置:");
        scanf("%d",&i);
        printf("请输入插入元素的值:");
        scanf("%d",&x);
        DLinkListInsert(list,i,x);
        for(start = list->next; start != NULL; start = start->next)
            printf("%d ",start->data);
        printf("
    ");
        printf("请输入要删除的位置:");
        scanf("%d",&i);
        DLinkListDelete(list,i); 
        for(start = list->next; start != NULL; start = start->next)
            printf("%d ",start->data);
        printf("
    ");
     
        return 0;
    } 

    ---

  • 相关阅读:
    创建vlan 和 节点vlan 连通性排查
    FRRouting SR-MPLS
    mpls over gre
    linux mpls
    交换机vlan
    neutron subnet + router
    neutron 层次绑定 +binding_levels
    frrouting命令补全 + 启动失败排查
    Paper Pal:一个中英文论文及其代码大数据搜索平台
    游戏服务器设计 Unity3d + photon + grpc + nodejs + postgis/postgresql
  • 原文地址:https://www.cnblogs.com/Ph-one/p/6889185.html
Copyright © 2011-2022 走看看