链表

链表

线性表的另一种实现方式。每个结点不仅不含元素本身的信息,还包含了元素之间的逻辑关系:前驱结点包含了后继结点的信息。
不再支持随机访问,但插入和删除操作比顺序表简单。
因为,物理结构不再连续,需要我们自己去维护结点之间的地址关系。
单向链表
定义

在每个结点中除了包含数据域外,还包含了一个指针域,用于指向其后继结点。
类型分为带头结点和不带头结点的链表。

单:链表中地址指向为单向。故遍历的方向也是单向。

用结构体定义一个结点

struct elt {
int data;
struct elt *next;
};

头结点

不带头结点的单向链表。

我们一般都会将一个结构体指针变量直接指向链表的起始结点,但更多的时候,我们会把头结点封装到一个结构体中,以便于我们存放更多地有关该链表的信息。(如图)

结构体定义为:

struct elt {
int data;
struct elt *next;
};

删除一个结点

p->next = p->next->next; //main code

增加一个结点

new->next = p->next;
p->next = new;

#include <stdio.h>
#include <malloc.h>
/**
* @time:2016/9/6
* @author:j
* @info:the implement of single linked list with head node
*
**/


//the node
struct NodeN{
    int data;
    struct NodeN *next;
};

typedef struct NodeN *Node;

void init(Node *Lp);
void insert(Node L,int data);
int isExist(Node L,int data);
void del(Node L,int data);
void print(Node L);
void destroy(Node L);
Node search(Node L,int data);
Node locate(Node L,int data);

void init(Node *Lp) {
    Node tmp = (struct NodeN *)malloc(sizeof(struct NodeN));
    tmp->next = NULL;    //empty linked list
    tmp->data = -999;   //first head
    *Lp = tmp;
    return;
}

void insert(Node L,int data) {
    Node tmp = (struct NodeN *) malloc(sizeof(struct NodeN));
    tmp->data = data;
    if(L->next == NULL) { // empty  
        tmp->next = NULL;
        L->next = tmp;
    } else {
        Node p = locate(L,data);
        tmp->next = p->next;
        p->next = tmp;
    }
}

void del(Node L,int data) {
    Node tmp = search(L,data);
    Node del = tmp->next;
    if(NULL != tmp) { //I find it
        tmp->next = tmp->next->next;
        free(del);
    }
}

Node search(Node L,int data) {
    Node tmp = L;
    while(tmp->next != NULL) {
        if(tmp->next->data == data) {
            return tmp;
        }
        tmp = tmp->next;
    }
    return NULL;
}

Node locate(Node L,int data) {
    Node tmp = L;
    while(tmp->next != NULL) {
        if(tmp->next->data > data) {
            return tmp;
        }
        tmp = tmp->next;
    }
    return tmp;
}

void print(Node L) {
    Node tmp = L->next;
    while(tmp!=NULL) {
        printf("data is %d\t",tmp->data);
        printf("next address is %d",tmp->next);
        printf("\n");
        tmp = tmp->next;
    }
}

void destroy(Node L) {
    if(L->next!=NULL)
        destroy(L->next);

    free(L);
}

int main() {
    Node L1;
    init(&L1);
    insert(L1,10);
    insert(L1,5);
    insert(L1,8);
    del(L1,8);
    print(L1);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值