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

2020-08-20  本文已影响0人  金珉锡_4bc1
#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;
}
上一篇下一篇

猜你喜欢

热点阅读