• 链表的一点总结


    自己实现的一个简单的链表,功能不是很全,而且有很重大的错误,就是一级指针是没办法修改之前传过来的指针的,所以要使用二级指针或者是返回指针

    //总结:1.参数检查 对于插入操作等要检查插入位置等 对于删除操作要检查链表是否为空
    //      2.创建链表可以不将创建所有的节点放在整个函数中,而是写一个类似的CreateNode(struct node* p_head, elemtype e)之类的函数
    
    
    //链表的基本操作的实现,使用单个的函数实现逐个的操作
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    ///////////////////////////////////
    
    //创建链表 参数为头指针和新建节点的个数
    int CreateLinkList(struct node* p_head, int n);
    //插入节点,参数为头指针,和插入位置。其中位置使用一个整数location来表达。
    //对location参数要进行判断。
    //1.loaction < 0抛出异常  2.location = 0这样插入的节点就成了第一个节点,注意转移头指针 3.loaction超过链表的节点个数,异常
    int InsertNode(struct node* p_head, int location, int id);
    
    //获取链表的长度,就是节点的个数,参数为头指针
    int GetLength(struct node* p_head);
    //打印整个链表 参数为头指针
    void ShowLinkList(struct node* p_head);
    
    
    ///////////////////////////////////
    
    //定义结构体  数据结构核心
    struct node
    {
        int id;
        //char name[20];
        struct node* next;
    };
    
    
    
    //p_head头指针,永远指向第一个节点
    struct node* p_head = NULL;
    //p_node可以指向任意一个节点
    struct node* p_node;
    //new_node指针
    struct node* new_node;
    
    //主函数////////////////////////////
    int main(int argc, char* argv[])
    {
        
        //创建一个链表  参数是头指针?
        //printf("%d
    ",CreateLinkList(p_head, 5));
        CreateLinkList(p_head, 5);
        ShowLinkList(p_head);
        printf("length = %d", GetLength(p_head));
    
        ///////////////////////////////////////
        //主函数结束 不要修改
        getchar();
        return 0;
    }
    
    int CreateLinkList(struct node* p_head, int n)
    {
        int i;
        //新建第一个节点
        new_node = (struct node*)malloc(sizeof(struct node));
        new_node -> next = NULL;
        new_node -> id = 0;
        //strcpy(new_node -> name, "a");
        //p_head和p_node都是指向第一个节点
        p_head = new_node;
        p_node = new_node;
        for(i = 0;i < n - 1;i++)
        {
            new_node = (struct node*)malloc(sizeof(struct node));
            new_node -> next = NULL;
            new_node -> id = i + 1;
            //p_node后移 指针变换
            p_node -> next = new_node;
            //p_node = p_node -> next;
            p_node = new_node;
        }
        //成功标志?
        //printf("1");
        return 1;
    }
    
    int GetLength(struct node* p_head)
    {
        int length = 0;
        for(p_node = p_head;p_node != NULL;p_node = p_node -> next)
        {
            length++;
        }
        return length;
    }
    
    void ShowLinkList(struct node* p_head)
    {
        for(p_node = p_head;p_node != NULL;p_node = p_node -> next)
        {
            printf("%d
    ", p_node -> id);
        }
    }
    
    
    
    int InsertNode(struct node* p_head, int location, int id)
    {
        int n = 1;
        if(location < 0 || location > GetLength(p_head))
        {
            printf("错误,插入位置错误");
            //错误处理 暂时省略
        }
        if(location = 0)
        {
            new_node = (struct node*)malloc(sizeof(struct node));
            new_node -> id = id;
            new_node -> next = p_head;
            p_head = new_node;
        }
        else
        {
            for(p_node = p_head;n < location;p_node = p_node -> next)
            {
                n++;
            }
            new_node = (struct node*)malloc(sizeof(struct node));
            new_node -> id = id;
            new_node -> next = p_node -> next;
            p_node -> next = new_node;
        }    
        return 1;
    }

    这个才是正确的

    #include <stdio.h>
    #include <stdlib.h>
    struct Node{
        int data;
        struct Node *next;
    };
    void InitList(struct Node **pHead);
    struct Node* CreatNode(int d);
    struct Node* FindKth(struct Node* head, int k);
    int Insert(struct Node** pHead, int index, int element);
    void PrintList(struct Node* head);
    void DestroyList(struct Node** pHead);
    int DeleteNode(struct Node** pHead, int index);
    int main(){
        
        struct Node *head;
        InitList(&head);
        Insert(&head, 1, 6);
        Insert(&head, 1, 61);
        Insert(&head, 1, 62);
        Insert(&head, 1, 63);
        Insert(&head, 1, 64);
        PrintList(head);
        printf("%d
    ",DeleteNode(&head, 6));
        PrintList(head);
        DestroyList(&head);
        return 0;
    }
    int DeleteNode(struct Node** pHead, int index){
        struct Node* pTmp, *pNodeToBeDeleted;
        if (*pHead == NULL) {
            return -1;
        }
        if (index == 1) {
            pTmp = *pHead;
            *pHead = (*pHead)->next;
            free(pTmp);
            return 0;
        }
        pTmp = FindKth(*pHead, index-1);
        if (!pTmp) { // if(pTmp == NULL)
            return -2;
        }
        if (pTmp->next == NULL) {
            return -3;
        }
        pNodeToBeDeleted = pTmp->next;
        pTmp->next = pNodeToBeDeleted->next;
        free(pNodeToBeDeleted);
        return 0;
    }
    void DestroyList(struct Node** pHead){
        struct Node* pTmp;
    
        while (*pHead) {
            pTmp = *pHead;
            *pHead = (*pHead)->next;
            free(pTmp);
        }
    }
    void PrintList(struct Node* head){
        struct Node* pTmp;
        pTmp = head;
        while (pTmp) {
            printf("%d  ",pTmp->data);
            pTmp = pTmp->next;
        }
        printf("
    ");
    }
    int Insert(struct Node** pHead, int index, int element){
        struct Node* pTmp, *pTmpNode;
        if (index == 1) {
            pTmpNode = CreatNode(element);
            pTmpNode->next = *pHead;
            *pHead = pTmpNode;
            return 0;
        }
        else{
            pTmp = FindKth(*pHead, index-1);
            if (pTmp) {
                pTmpNode = CreatNode(element);
                pTmpNode->next = pTmp->next;
                pTmp->next = pTmpNode;
                return 0;
            }
            else return -1;
        }
    }
    struct Node* FindKth(struct Node* head, int k){
        struct Node* pTmp;
        pTmp = head;
        int i=1;
        while (pTmp && i<k) {
            pTmp = pTmp->next;
            i++;
        }
        return pTmp;
    }
    void InitList(struct Node **pHead){
        *pHead = NULL;
    }
    struct Node* CreatNode(int d){
        struct Node* pTmp;
        pTmp = (struct Node*)malloc(sizeof(struct Node));
        pTmp->data = d;
        pTmp->next = NULL;
        
        return pTmp;
    }
  • 相关阅读:
    2018 ICPC南京网络赛 A An Olympian Math Problem(数论题)
    算法竞赛模板 素数测试(Miller-Rabin测试)
    算法竞赛模板 tarjan算法
    2018 CCPC网络赛 1004 Find Integer(勾股数+费马大定理)
    算法竞赛模板 概率dp
    算法竞赛模板 重载运算符
    算法竞赛模板 矩阵快速幂
    算法竞赛模板 回文素数
    算法竞赛模板 AC自动机
    算法竞赛模板 拓扑排序
  • 原文地址:https://www.cnblogs.com/virusdefender/p/3342986.html
Copyright © 2020-2023  润新知