数据结构单链表及基本操作实现(C语言实现)

单链表的基本操作的实现

定义(个人看法):单向链表是通过指针的方式将个各个节点串联起来形成链式结构;
特点:具有插入和删除操作方便,但其访问链表中的元素没有顺序表快;

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct LNode *LinkList;
struct LNode {
    ElementType element;
    struct LNode *next;
} LNode;


//**************定义操作**********************//
/*有头节点*/
LinkList InitList();

void PrtList(LinkList L);

LinkList List_HeadInsert(LinkList L, ElementType e);

LinkList List_TailInsert(LinkList L, LinkList P, ElementType e);

int List_Length(LinkList L);

int GetLocate(LinkList L, ElementType FindE);

int GetElement(LinkList L, int locate);

LinkList DeleteNode(LinkList L, ElementType e);
//******************************************//

int main() {
    /*有头节点*/
    LinkList List = InitList();//L指针用于指向该链表的表头
    LinkList Point = List;
    for (int i = 0; i < 5; i++) {
        Point = List_TailInsert(List, Point, i);
    }
    List = DeleteNode(List, 5);
    printf("%d\n", List_Length(List));
    PrtList(List);
    return 0;
}

//***********************实现操作********************************//

/*有头节点的*/
LinkList InitList() {
    //含有头节点的初始化方法
    LinkList NewNode = (LinkList) malloc(sizeof(LNode));
    NewNode->next = NULL;
    return NewNode;
}

LinkList List_HeadInsert(LinkList L, ElementType e) {
    //前插建立单向链表
    //L是一个指向结构体的指针
    LinkList NewNode = (LinkList) malloc(sizeof(LNode));
    NewNode->next = L->next;
    L->next = NewNode;
    NewNode->element = e;
    //该指针指向表头
    return L;
}

LinkList List_TailInsert(LinkList L, LinkList P, ElementType e) {
    //后插建立单向链表
    LinkList NewNode = (LinkList) malloc(sizeof(LNode));
    P->next = NewNode;
    P = NewNode;
    NewNode->next = NULL;
    NewNode->element = e;
    return P;
}

void PrtList(LinkList L) {
    //用于打印节点的元素值
    LinkList TempCell = NULL;
    do {
        TempCell = L->next;
        printf("Site:%p\tElement:%d ->\n", TempCell, TempCell->element);
        L = TempCell;
    } while (TempCell->next != NULL);

}

int List_Length(LinkList L) {
    int counter = 0;
    while (L->next != NULL) {
        L = L->next;
        counter++;
    }
    return counter;
}

int GetLocate(LinkList L, ElementType FindE) {
    //通过元素获取该元素的位置
    int counter = 0;
    while (L != NULL) {
        if (L->element == FindE)
            return counter;
        else {
            counter++;
            L = L->next;
        }
    }
    return -1;
}

ElementType GetElement(LinkList L, int locate) {
    //通过位置获取该位置的元素
    if (locate > List_Length(L)) {
        printf("Over this list of length");
        return (ElementType) NULL;
    } else {
        locate = locate - 1;
        while (locate >= 0) {
            L = L->next;
            locate--;
        }
        return L->element;
    }
}

LinkList DeleteNode(LinkList L, ElementType e) {
    LinkList P = L;
    if (P->element == e) {
        //当被删除的节点是头节点
        L = P->next;
        free(P);
        return L;
    }
    while (P->next != NULL) {
        if (P->next->element == e && P->next->next == NULL) {
            //当被删除的节点是尾节点
            free(P->next);
            P->next = NULL;
            return L;
        }
        if (P->next->element == e && P->next->next != NULL) {
            //当删除的节点是中间节点
            LinkList TempCell = NULL;
            TempCell = P->next->next;
            free(P->next);
            P->next = TempCell;
            return L;
        }
        P = P->next;
    }
    printf("Not find the node!!");
    //返回指针的时候不要随便返回NULL!!!!!
    return L;
}

//**********************#end********************************//
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值