zoukankan      html  css  js  c++  java
  • 单链表实现(LinkedList) for C

    //
    //  LinkedList.hpp
    //  test1
    //
    //  Created by Zy on 2020/3/28.
    //  Copyright © 2020 Jovan. All rights reserved.
    //
    
    #ifndef LinkedList_hpp
    #define LinkedList_hpp
    #include <stdlib.h>
    #include <memory.h>
    #include <stdio.h>
    #define MAXLEN 100
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -1
    typedef int Status;
    typedef char ElemType;
    typedef struct node{
        ElemType data;
        struct node *next=NULL;
    }LinkedList;
    //初始化、创建->插入,删除,查找,读取->清空
    LinkedList * InitList();
    void CreateList(LinkedList *);//尾插入构建list
    int GetLength(LinkedList *);
    LinkedList *Locate(LinkedList *, ElemType );//查找元素位置f,返回一个指针
    LinkedList *GetAt(LinkedList *,int);//按照index查找,下标从1开始
    Status InsertElem(LinkedList *, ElemType);//按照指针位置插入元素(如果参数是头指针,则是首插入,可以通过p=p->next改变插入位置)
    Status InsertElemAt(LinkedList *, int, ElemType);//按序插入
    Status DeleteElem(LinkedList *,ElemType *);//删除指针位置后第一个结点,并得到该点的值x
    Status DeleteElemAt(LinkedList *, int ,ElemType *);//按序删除
    void Erase(LinkedList *);
    void PrintList(LinkedList *);
    #endif /* LinkedList_hpp */
    //
    //  LinkedList.cpp
    //  test1
    //
    //  Created by Zy on 2020/3/28.
    //  Copyright © 2020 Jovan. All rights reserved.
    //
    
    #include "LinkedList.hpp"
    LinkedList *InitList(){
        LinkedList *L;
        L = (LinkedList *)malloc(sizeof(LinkedList));
        L->next = NULL;
        return L;
    }
    void CreateList(LinkedList *L){
        LinkedList *s,*last;
        char ch;
        last=L;
        while((ch=getchar())!='#'){
            s = (LinkedList *)malloc(sizeof(LinkedList));
            s->data = ch; //构建一个结点
            s->next = NULL;
            last->next = s;
            last=s;
        }
    }
    int GetLength(LinkedList *L){
        LinkedList *p;
        p=L;
        int cnt=0;
        while(p->next!=NULL){
            p=p->next;
            cnt++;
        }
        return cnt;
    }
    LinkedList *Locate(LinkedList *L, ElemType x){
        LinkedList *p;
        p=L->next;
        while(p!=NULL&&p->data!=x){
            p=p->next;
        }
        return p;
    }
    LinkedList *GetAt(LinkedList *L,int index){
        LinkedList *p = L;
        int i;
        for(i=0;i<index;i++)
            if(p->next) p = p->next;
            else return NULL;
        return p;
    }
    Status InsertElem(LinkedList *p, ElemType x){
        if(!p) return ERROR;
        LinkedList *q=(LinkedList *)malloc(sizeof(LinkedList));
        q->data = x;
        q->next = p->next;
        p->next=q;
        return OK;
    }
    
    Status InsertElemAt(LinkedList *L, int index, ElemType x){
        LinkedList *p = GetAt(L, index-1);
        if(!L) return ERROR;
        InsertElem(p, x);
        return OK;
    }//按位插入O(1),按序插入O(n)
    
    Status DeleteElem(LinkedList *L,ElemType *x){
        LinkedList *p = L->next;
        if(!p) return ERROR;
        *x = p->data;
        L->next=p->next;
        free(p);
        return OK;
    }//删除指针后一个元素,并参数返回该点值
    
    Status DeleteElemAt(LinkedList *L, int index,ElemType *x){
        LinkedList *p = GetAt(L, index-1);
        if(p) return DeleteElem(p, x);
        else return ERROR;
    }
    void Erase(LinkedList *L){
        LinkedList *p = L->next;
        LinkedList *t = L->next;
        while(p){
            t = p->next;
            //printf("%c;",p->data);
            free(p);
            p=t;
        }
        L->next = NULL;
    }
    void PrintList(LinkedList *L){
        LinkedList *p = L;
        while(p->next){
            p = p->next;
            printf("%c ",p->data);
        }
        printf("
    ");
    }

    测试代码:

    LinkedList *L1 = InitList(); //利用初始化函数构建实例;
        LinkedList L2;
        CreateList(&L2);//输入 abcdef#
        PrintList(&L2);
        InsertElem(&L2,'0');
        PrintList(&L2);
        InsertElemAt(&L2, 2, 's');
        PrintList(&L2);
        char x=' ';
        DeleteElem(&L2, &x);
        PrintList(&L2);
        DeleteElemAt(&L2, 3, &x);
        PrintList(&L2);
        printf("长度为%d
    ",GetLength(&L2));
        Erase(&L2);
        free(L1);

    abcdef#

    a b c d e f 

    0 a b c d e f 

    0 s a b c d e f 

    s a b c d e f 

    s a c d e f 

    长度为6

  • 相关阅读:
    针对Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1的解决方案
    MAC配置C++运行环境
    Keras 模型相关操作
    微信小程序 WXS
    vue 长列表优化
    webpack4 SplitChunks插件 代码拆分
    node path api
    mysql的模型依赖说明
    MySQL和MyCat replace
    SQL Server中WITH(NOLOCK)提示用在视图上会怎样(转载)
  • 原文地址:https://www.cnblogs.com/raiuny/p/12587337.html
Copyright © 2011-2022 走看看