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;
    } 

    ---

  • 相关阅读:
    SCILAB简介[z]
    UG OPEN API编程基础 2约定及编程初步
    Office 2003与Office 2010不能共存的解决方案
    UG OPEN API 编程基础 3用户界面接口
    NewtonRaphson method
    UG OPEN API编程基础 13MenuScript应用
    UG OPEN API编程基础 14API、UIStyler及MenuScript联合开发
    UG OPEN API编程基础 4部件文件的相关操作
    UG OPEN API编程基础 1概述
    16 UG Open的MFC应用
  • 原文地址:https://www.cnblogs.com/Ph-one/p/6889185.html
Copyright © 2011-2022 走看看