zoukankan      html  css  js  c++  java
  • C语言实现链表及其操作

    #include <stdio.h>
    #include <stdlib.h>
    
    //定义节点
    typedef struct Node
    {
        int data;
        struct Node * PNext;
    }*PNode,Node;
    
    //初始化函数
    PNode create_list();//创建节点
    //打印出链表
    void traverse_list(PNode);
    //删除节点pos  从1 开始
    void delete_node(PNode,int,int *);
    
    //插入节点  pos 从1开始
    void insert_data(PNode,int ,int );
    void main()
    {
        //int val;
        //定义头指针
        PNode PHead=NULL;
        PHead=create_list();
        
        
        //delete_node(PHead,-1,&val);
        
        insert_data(PHead,-2,2);
        traverse_list(PHead);
    }
    
    
    PNode create_list()
    {
        int len;
        int i;
        int val;
        //定义头节点
        PNode PHead=(PNode)malloc(sizeof(Node));
        //内存不足等情况会出现分配内存失败的情况  发生错误会返回NULL
        if(PHead == NULL){
            printf("内存分配失败");
        }
        PNode Ptail=PHead;
        //将头节点的指针域指向NULL  如果没有首节点指针域就是NULL 
        Ptail->PNext=NULL;
    
        /*
            思路:
                定义节点ptail,永远指向尾节点,一开始只有头结点 头结点也是尾节点,所以指向头结点
            
                将新建的PNew节点挂载到ptail节点后面,挂载好之后,ptail指向新建的PNew节点,这样保证ptail永远指向尾节点
        */
        printf("请输入初始化节点的数量
    ");
        scanf("%d",&len);
        for(i=0;i<len;i++){
            printf("请输入节点的值");
            scanf("%d",&val);
    
            PNode PNew=(PNode)malloc(sizeof(Node));
            PNew->data=val;
            Ptail->PNext=PNew;
            PNew->PNext=NULL;
            Ptail=PNew;
        }
        //返回首节点
        return PHead;
    }
    
    void traverse_list(PNode PHead)
    {
        PNode p = PHead->PNext;
        //printf("%d
    ",PHead->PNext);
        if(p == NULL)
        {
            printf("链表为空
    ");
            exit(0);
        }
        while(p != NULL){
            printf("%d
    ",p->data);
            p=p->PNext;
        }
    
    }
    
    void delete_node(PNode PHead,int pos,int * val)
    {
        
        int i=0;
        if(PHead->PNext==NULL){
            printf("节点为空");
            exit(0);
        }
        if(pos <0){
            printf("没有数据");
            exit(0);
        }
        PNode p=PHead;
        PNode t;
        PNode r;
        while(i != pos){
            //printf("%d
    ",i=t->data);exit(0);
            t=p;
            if(i == pos-1){
                //printf("%d
    ",i=p->PNext->PNext->data);exit(0);
                //exit(0);
                r=p->PNext;
                t->PNext=p->PNext->PNext;
                free(r);
                r=NULL;
                //exit(0);
                return;
            }
            i++;
            p=p->PNext;
        }
    }
    
    void insert_data(PNode PHead,int pos,int val)
    {
        int i=0;
        PNode p=PHead;
        while(p != NULL && i<pos-1){
            p=p->PNext;
            i++;
        }
        if(p == NULL || i>pos -1){
            printf("插入错误");
            return ;
        }
    
        PNode PNew=(PNode)malloc(sizeof(Node));
        if(PNew == NULL){
            printf("内存分配失败");
            exit(-1);
        }
        PNode t=p->PNext;
        PNew->data=val;
        PNew->PNext=t;
        p->PNext=PNew;
    }
  • 相关阅读:
    2019New XTOOL X100 PAD钥匙编程器:有啥好用的吗?
    AUTEL MaxiSys MS906BT常见问题解答:修改速度限制器,输入VIN号码
    Autel MaxiAP AP200:功能,特性,评论
    OBDSTAR X300 PRO3详细评论
    Autel MaxiIM IM608:关于如何更新和一些评论
    Autel MaxiAP AP200:功能,特性,评论,
    OBDSTAR X300 PRO3详细评论
    k8s 基础总结
    k8s yaml 编写
    k8s 生命周期概况
  • 原文地址:https://www.cnblogs.com/IT--Loding/p/6294197.html
Copyright © 2011-2022 走看看