zoukankan      html  css  js  c++  java
  • 单向循环链表

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #include<assert.h>
    
    typedef struct node
    {
        int data;
        struct node *next;
    }NODE,*PNODE,*LINKLIST;
    
    //初始化
    void init(LINKLIST *list)
    {
        (*list) = (PNODE) malloc(sizeof(NODE));
        (*list) ->next = *list;//头指针指向头结点
    }
    
    //添加数据,
    void add(LINKLIST list,int data)
    {
        PNODE p=list,q;
        //先将p移动到最后一个节点
        while(p->next != list)
        {
            p=p->next;
        }//end while
        q=(PNODE)malloc(sizeof(NODE));
        q->data = data;
        q->next = list;//新节点的指针域始终指向头结点
        p->next = q;
    }//end add
    
    //删除list中第i个节点   i>=1
    void del(LINKLIST list,int i,int *data)
    {
        PNODE p=list,q;
        assert(i>=1 && p);
        while(--i)
        {
            p=p->next;
            if(p->next==list)
                break;
        }
        assert(i==0);//为i断言,防止删除操作不合法
        q=p->next;//q为需要删除的节点
        *data = q->data;
        p->next = q->next;
        free(q);
    }//end del
    
    //在list中的第i个位置插入节点
    void insert(LINKLIST list,int i,int data)
    {
        PNODE p=list,q;
        while(--i && p->next!=list)
        {
            p=p->next;
        }
        assert(i==0);
        q = (PNODE)malloc(sizeof(NODE));
        q->data =data;
        q->next = p->next;
        p->next = q;
    }
    
    //获取链表的第i个位置,i>=1
    int getData(LINKLIST list,int i)
    {
        PNODE p=list;
        //将p移动到链表的第i-1个位置
        while(--i && p->next!=list)
        {
            p=p->next;
        }
        assert(i==0);
        return p->data;
    }
    
    //获取链表的长度
    int getLen(LINKLIST list)
    {
        PNODE p=list;
        int len=0;
        assert(p);
        while((p=p->next)!=list)
            len++;
        return len;
    }
    
    //清空链表
    void clear(LINKLIST list)
    {
        PNODE p=list,q;
        assert(p);
        while(p->next!=list)
        {
            q=p->next;//q需要删除
            p->next = q->next;
            free(q);
        }
    }
    
    //链表销毁
    void destory(LINKLIST *list)
    {
        PNODE p=*list,q;
        assert(p);
        do
        {
            q=p->next;
            free(p);
            p=q;
        }while(p!=*list);
        *list=NULL;
    }
    
    //显示链表
    void display(LINKLIST list)
    {
        PNODE p=list;
        while((p=p->next)!=list)
            printf("%d ",p->data);
        printf("
    ");
    }
    
    int main()
    {
        int i,j;
        LINKLIST list=NULL;
        init(&list);
        for(i=1;i<=10;i++)
            insert(list,i,i);
    
        insert(list,11,100);
        display(list);
        
        destory(&list);//销毁链表
        system("pause");
        return 0;
    }
  • 相关阅读:
    疫情控制
    2020 CSP-J 多校赛 Day 2 T2 题解
    三校联考-水题狂欢信心赛
    QBXT 提高组储备营 2020.夏 游记
    【题解】(我出的题)XM捡面筋
    【题解】P4025 [PA2014]Bohater
    【题解】1644:【例 4】佳佳的 Fibonacci
    【题解】CF1165F2 Microtransactions (hard version)
    P2261 [CQOI2007]余数求和
    OVO——扶咕咕的20道CF
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3404204.html
Copyright © 2011-2022 走看看