前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单向链表

单向链表

作者头像
用户3094376
发布2018-09-12 11:28:00
5540
发布2018-09-12 11:28:00
举报
文章被收录于专栏:gaoqin31gaoqin31gaoqin31

说来惭愧,大学有数据结构课程,然而当时根本没学懂什么东西,出来混迟早是要还的。

链表: 数组在内存中是连续存放的,而链表在内存中布局是不规则的,每个节点都可以通过指针找到后继,最后一个节点的指针域为NULL。 以下是单向链表图和实现

代码:

link.h

#ifndef LINK_H
#define LINK_H

#define LEN sizeof(Link)
struct Node;
typedef struct Node * Link;
typedef int Type;
struct Node{
    Type E;
    Link Next;
};

Link MakeNode(Type E);
void Lpush(Link L);
void RPush(Link L);
void Insert();
Link Pop();
void MakeEmpty();
Link Search();
void PrintLink();

#endif

link.c

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

static Link Head = NULL;

//生成节点
Link MakeNode(Type E){
    Link P = malloc(LEN);
    P->E = E;
    P->Next = NULL;
    return P;
}

//在链表左侧插入元素
void LPush(Link L){
    L->Next = Head;
    Head = L;
}

//在链表右侧插入元素
void RPush(Link L){
    if(Head == NULL){
        Head = L;
    }else{
        Link P = Head;
        while(P->Next != NULL){
            P = P->Next;
        }
        P->Next = L;
    }
}

//在指定元素位置后插入
void Insert(Link L ,Type E){        
    if(Head == NULL || Head->Next == NULL){//不足2个元素
        printf("InsertError:link length less than 2");
        return;
    }
    Link P = Search(E);
    if(P == NULL){//找不到指定元素
        printf("Insert Error:can't find element %d in link", E);
        return;
    }
    L->Next = P->Next;
    P->Next = L;
}

Link Pop(){
    if(Head == NULL){
        return NULL;
    }
    Link P = Head;
    Head = Head->Next;
    return P;
}

void MakeEmpty(){
    if(Head == NULL){
        return;
    }
    Link P, Tmp;
    P = Head;
    Head = NULL;
    while(P != NULL){
        Tmp = P;
        P = P->Next;
        free(Tmp);
    }
}

Link Search(Type E){
    Link P = Head;
    if(P == NULL){
        return NULL;
    }
    while(P != NULL){
        if(P->E == E){
            return P;
        }
        P = P->Next;
    }
    return NULL;
}

void PrintLink(){
    Link P = Head;
    if(P == NULL){
        printf("empty Link\n");
        return;
    }
    while(P != NULL){
        printf("%d ", P->E);
        P = P->Next;
    }
    printf("\n");
}


int main(int argc, char *argv[]){
    int i;
    Link P;
    for(i = 1; i <= 10; i++){
        P = MakeNode(i);
        RPush(P);
    }
    PrintLink();
    Pop();
    Pop();
    PrintLink();
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档