链表

来源:互联网 发布:中国硕士人数知乎 编辑:程序博客网 时间:2024/06/05 02:20

链表

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

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

单:链表中地址指向为单向。故遍历的方向也是单向。用结构体定义一个结点

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 nodestruct 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
原创粉丝点击