简单的单链表

447 阅读2分钟

什么是单链表呢?

上一节我们讲了顺序表,它是一个挨着一个的数据。这一节我们讲单链表,它的数据结构不需要像顺表那样一个挨着一个,它是通过一个个结点组成的链表,一个结点包括了:数据域和指针域。数据域用来存储数据,指针域用来存储下一个结点的地址。单链表就是通过一个个结点的指针域将元素按照其逻辑次序链接在一起。

上代码

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


typedef struct Node
{
    int elem;//数据域
    struct Node *next;//指针域
}Node;//创建一个结构体

Node *initLink(int i);//初始化单链表
void showLink(Node *L);//打印单链表
Node *insert(Node *L,int add,int newElem);//添加一个元素
Node *update(Node *L,int edit,int editElem);//更新一个元素
Node *delete(Node *L,int del);//删除一个元素

int main()
{
    
    Node *L = initLink(5);
    showLink(L);
    printf("\n");
    
    
    L = insert(L, 3, 8);
    showLink(L);
    printf("\n");
    
    L = update(L, 3, 7);
    showLink(L);
    printf("\n");
    
    L = delete(L, 3);
    showLink(L);
    
    getchar();
    return 0;
}

Node *initLink(int i)
{
    Node *L = (Node*)malloc(sizeof(Node));//创建头结点
    Node *temp = L;//创建一个临时指针,不至于丢失头指针
    int j;
    for (j=1; j<i; j++) {
        Node *a = (Node*)malloc(sizeof(Node));//申请空间
        a->elem = j;
        a->next = NULL;
        temp->next = a;//创建了 a这个结点,然后让头结点的指针域指向它
        temp = a; //更新结点的位置,这样下次循环的时候 temp 的结点向下移动了一个
    }
    return L;
}

void showLink(Node *L)
{
    Node *temp = L;
    while (temp->next) {//通过头结点,循环出所有的数据
        temp = temp->next;
        printf("%d", temp->elem);
    }
}


Node *insert(Node *L,int add,int newElem)
{
    Node *temp = L;
    int j;
    for (j=1; j<add; j++) {
        temp = temp->next;//找到要插入的位置
    }
    
    Node *a = (Node*)malloc(sizeof(Node));//申请一个结点。
    a->elem = newElem;
    a->next = temp->next;//插入后,更新结点的指针域
    temp->next = a;//把上一个结点的指针域 指向新的结点
    
    return L;
}

Node *update(Node *L,int edit,int editElem)
{
    Node *temp = L;
    int j;
    for (j=1; j<edit; j++) {
        temp = temp->next;//找到要更新的结点
    }
    temp = temp->next;
    temp->elem = editElem;//更新
    return L;
}

Node *delete(Node *L,int del)
{
    Node *temp = L;

    int j;
    for (j=1; j<del; j++) {
        temp = temp->next;//找到要删除的指针地址
    }
    Node *destruction = temp->next;//将这个地址 赋予一个新的指针
    free(destruction);//释放内存
    temp->next = temp->next->next;//然后更新它的指针地址,让它的指针地址指向下一个指针!
    return L;
    
}


运行结果

结语

以后会往下更新的!