单链表的基本操作_创建、查询、插入、删除

考研终于结束了,本想着多玩几天,在第一天看了全天的电脑后感觉脑袋不行了,可能是很久没有这么长时间看电脑了吧。看来上天注定让我多看看书呀,最近在看《白鹿原》,一本非常好看的小说。

下面直接贴代码吧:
LinkList.h

#pragma once
#include
#include

typedef struct LNode{   //单链表节点
    int data;       //数据
    LNode *next;    //下一个节点指针
}LNode,*LinkList;

typedef struct List{    //单链表
    LNode *L;       //头指针
    int length;     //链表长度
}List;


void InitL(List *Li, int length) {      //初始化链表
    Li->length = length;
    Li->L = (LNode *)malloc(sizeof(LNode));
    Li->L->next = NULL;
}

int GetElem(List *Li, int i) {      //取第i个节点的数据
    if (i > Li->length) {
        printf("超过链表长度\n");
        return -1;
    }
    LNode* p = Li->L;
    int j = 0;
    if (p->next&&j <= i - 1){
        p = p->next;
        j++;
    }
    return p->data;
}

int LocalElem(List *Li, int e) {        //按值查询链表
    LNode *p = Li->L;
    for (int i = 0; i < Li->length; i++) {
        p = p->next;
        if (p->data == e)
            return i+1;
    }
    return -1;
}

void ListInsert(List *Li, int local, int e) {   //在第local个节点处插入值为e的节点
    if (local<0 || local>Li->length + 1) {
        printf("超过链表长度\n");
        return;
    }
    LNode *p = Li->L;
    for (int i = 0; i < local - 1; i++) {
        p = p->next;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e; s->next = p->next;
    p->next = s;
    Li->length++;
}

void ListDelete(List *Li, int local) {      //删除在第local处的节点
    if (local<0 || local>Li->length) {
        printf("超过链表长度\n");
        return;
    }
    LNode *p = Li->L;
    for (int i = 0; i < local - 1; i++)
        p = p->next;
    LNode *s = p->next;
    p->next = s->next;
    free(s);
    Li->length--;
}



void CreatList_H(List *Li, int length, int *a) {    //前插法创建链表
    LNode *L = Li->L;
    for (int i = length - 1; i >= 0; i--) {
        LNode *p = (LNode*)malloc(sizeof(LNode));
        p->data = a[i];
        p->next = L->next;
        L->next = p;
    }
}


void CreatList_R(List *Li, int length, int *a) {    //后插法创建链表
    //LNode *L = Li->L;
    LNode *r = Li->L;
    for (int i = 0; i < length; i++) {
        LNode *p = (LNode*)malloc(sizeof(LNode));
        p->data = a[i];
        p->next = NULL;
        r->next = p;
        r = p;
    }
}

void PrintList(List *Li) {      //顺序输出链表
    LNode *p = Li->L;
    for(int i=0 ;i < Li->length;i++){
        p = p->next;
        printf("%d ", p->data);
    }
    printf("\n");
}

main.cpp

#include "LinkList.h"


int main() {
    List *Li = (List*)malloc(sizeof(List));
    int length = 10;
    InitL(Li, length);      
    int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
    CreatList_H(Li, length, a);     //创建链表_前插法
    //CCreatList_R(Li, length, a);  //创建链表_后插法
    PrintList(Li);                  //输出链表

    printf("%d\n", LocalElem(Li, 9));//根据数据定位节点

    printf("%d\n", GetElem(Li, 1));  //根据节点位置取数据

    ListInsert(Li, 11, 10);         //在节点位置为10的地方插入数据为10的节点
    PrintList(Li);

    ListDelete(Li, 11);             //删除节点位置为11的节点
    PrintList(Li);

    return 0;
}


结果:
单链表的基本操作_创建、查询、插入、删除_第1张图片

你可能感兴趣的:(基本知识)