美文网首页
2020-08-20[单向循环链表实现 ]

2020-08-20[单向循环链表实现 ]

作者: 金珉锡_4bc1 | 来源:发表于2020-08-20 22:39 被阅读0次
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    
    /*
        单向循环链表实现 
    */
    
    typedef struct Node
    {
        int data;
        struct Node* Next;
    } Node;
    typedef struct Node* List;
    
    // 创建单向循环链表
    void CreateList(List* L, int n)
    {
        srand(time(0));
        
        *L = (List)malloc(sizeof(Node)); // 给头结点分配空间 
        
        (*L)->Next = *L; // 头结点不存放数据,指向自身 
        
        List pTail = *L;    // 创建尾结点,初始化让其指向头结点
        
        for(int i = 0; i < n; i++){
            List pNew = (List)malloc(sizeof(Node));
            pNew->data = rand() % 100 + 1;
            pTail->Next = pNew; // 尾结点指向新创造的节点 
            pTail = pNew;   // 重定位尾结点位置 
        } 
    
        pTail->Next = *L; // 创建完成,让尾结点指向头结点 
    }
    // 打印链表
    void PrintList(List L)
    {
        List p = L->Next;
        // 遍历链表 
        while(p != L){
            printf("%d ", p->data);
            p = p->Next;
        }   
        printf("\n");
    }
    // 向链表中插入节点(在第pos个位置之后插入data) 
    void InsertList(List* L, int pos, int data)
    {
        List p = (*L)->Next;
        int i = 1;
        
        while(i != pos)
        {
            i++;
            p = p->Next;        
        }   
        
        List pNew = (List)malloc(sizeof(Node));
        pNew->data = data;
        pNew->Next = p->Next;
        p->Next = pNew;
    }
    // 从链表中删除节点(删除第pos个结点) 
    void DeleteList(List* L, int pos)
    {
        List p = (*L)->Next;
        int i = 1;
        //找到pos之前的位置就停止 
        while(i+1 != pos)
        {
            i++;
            p = p->Next;    
        }   
        
        List q = p->Next;
        
        p->Next = q->Next;
    
        free(q);
    }
    
    int main()
    {
        List l;
        
        CreateList(&l, 20);
        PrintList(l);
        
        InsertList(&l, 3, 300); 
        PrintList(l);
        
        DeleteList(&l, 5);
        PrintList(l);
        
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:2020-08-20[单向循环链表实现 ]

          本文链接:https://www.haomeiwen.com/subject/jkcyjktx.html