zoukankan      html  css  js  c++  java
  • 双向链表的基本操作 C语言

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node* DNode;
    struct node {
        int data;
        DNode prior; //前面数据地址
        DNode next;  //后面数据地址
    }; 
    //创建双向链表
    void CreatNode(DNode *head) {
        DNode s;  //新节点指针
        char e;
        (*head) = (DNode)malloc(sizeof(struct node));//头结点
        (*head)->prior = (*head);  //初始头结点的前驱和后驱都指向自己
        (*head)->next = (*head);
        printf("输入数据
    ");
        scanf("%c", &e);
        while (e!='
    ')
        {
            s = (DNode)malloc(sizeof(struct node)); //新节点分配空间
            s->data = e;
            s->prior = (*head);   //新节点的prior连前一个结点
            s->next = (*head)->next; //新节点的next连后边结点
            (*head)->next->prior = s; //后一个结点的prior连新结点
            (*head)->next = s;  //新节点前面的next连新结点
            scanf("%c", &e);
        }
    }
    //向后遍历输出
    void PrintList1(DNode L) {
        DNode p;
        p = L;
        p = p->next;
        while (p != L) {
            printf("%c", p->data);
            p = p->next;
        }
        printf("
    ");
    }
    //向前遍历输出
    void PrintList2(DNode L) {
        DNode p;
        p = L->prior;
        while (p != L) {
            printf("%c", p->data);
            p = p->prior;
        }
        printf("
    ");
    }
    //查找第i处数据的地址
    DNode FindPosition(DNode L,int i) {
        int j = 0;
        DNode p = L;
        while (p->next != L&&j < i) {
            p = p->next;
            j++;
        }
        return p;
    }
    //插入
    void InsertList(DNode L) {
        DNode s,p;  //s为新结点 p为新节点前一个结点
        int i;
        char e;
        printf("在第几处插入:
    ");
        scanf("%d", &i);
        getchar();
        printf("插入什么数据:
    ");
        scanf("%c", &e);
        p = FindPosition(L, i-1);  //新节点前一个结点地址
        s = (DNode)malloc(sizeof(struct node));//申请新节点空间
        s->data = e;
        s->prior = p;  //新节点的prior连上前一个结点
        s->next = p->next;  //新节点的next连上后一个结点
        p->next->prior = s;  //新节点后的结点的prior连上新结点
        p->next = s;         //新节点前的结点的next连上新结点
    }
    //删除
     void DeleteList(DNode L){
         DNode s,p;  //s为新结点 p为要删除的结点
         int i;
         printf("删除第几处的数据:
    ");
         scanf("%d", &i);
         p = FindPosition(L, i); //要删除结点的地址
         p->prior->next = p->next;  //要删除的结点的前一个结点的next,连上要删结点后的结点
         p->next->prior = p->prior;//要删除结点的后一个结点的prior,连上要删结点的前一个结点
         free(p);
     }
    
    
    int main() {
        DNode list;
        CreatNode(&list);
        //PrintList1(list);
        PrintList2(list);
        InsertList(list);
        PrintList2(list);
        DeleteList(list);
        PrintList2(list);
    }
  • 相关阅读:
    043 抖音短视频爬取实战
    048 Python里面yield的实现原理
    047 Python面试知识点小结
    001 Glang实现简单分布式缓存
    046 算法的时间复杂度和空间复杂度计算
    042 使用Python远程监视多个服务器和数据库的状态,python,监控,同步
    041基于python实现jenkins自动发布代码平台
    045 chrome浏览器前端调试技巧
    STL学习
    Asio与Boost.Asio
  • 原文地址:https://www.cnblogs.com/yudongxuan/p/8297470.html
Copyright © 2011-2022 走看看