线性表-单链表

322 阅读3分钟
  • 单链表概念

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据

  • 单链表结点

typedef int ElemType;

typedef struct Node {
    ElemType data;
    struct Node * next;
} Node;
  • 单链表逻辑状态

  • 单链表增加头结点的逻辑状态


添加头指针在插入链表的时候可以不必特殊判断插入位置是否为第一个位置,没有头结点的话插入到第一个位置时还需要修改首指针的指向

  • 单链表初始化

#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

typedef struct Node {
    ElemType data;
    struct Node * next;
} Node;

typedef struct Node *LinkList;

//单向链表操作(含有头结点)(也可以不设置头结点,但是在插入的时候就需要多判断插入的位置是不是1  是的话需要特殊判断)
Status createLinkList(LinkList *L){
    int number;
    LinkList temp = NULL;
    LinkList target = NULL;
    printf("可输入一个数值用于插入懂啊链表,输入0跳出循环\n");
    //向链表中插入数据
    while(1){
        scanf("%d",&number);
        if(number == 0) break;
        if(*L == NULL){
            //列表是NULL
            //1.创建一个新的节点
            //2.节点的next指向NULL
            *L = (LinkList)malloc(sizeof(Node));
            if(L == NULL) exit(0);
            (*L)->data = number;
            (*L)->next = NULL;
        }else{
            //列表不是NULL
            //1.创建一个新的节点
            //2.找到尾节点
            //3.新节点的next指向NULL
            //4.尾节点的next 指向新节点
            temp = (LinkList)malloc(sizeof(Node));
            if(temp == NULL) exit(0);
            for(target = *L; target->next != *L; target = target->next);
            temp->data = number;
            temp->next = NULL;
            target->next = temp;
        }
    }
    
    return OK;
}

//记录尾结点,下一次插入的时候不需要遍历查找尾结点
Status createLinkList2(LinkList *L){
    int number;
    LinkList temp = NULL;
    LinkList lastNode = NULL;
    printf("可输入一个数值用于插入懂啊链表,输入0跳出循环\n");
    while (1) {
        scanf("%d",&number);
        if(number == 0) break;
        if(*L == NULL){
            //列表是NULL
            //1.创建一个新的节点
            //2.节点的next指向NULL
            //3.lastNode = *L
            *L = (LinkList)malloc(sizeof(Node));
            if(*L == NULL) exit(0);
            (*L)->data = number;
            (*L)->next = NULL;
            lastNode = *L;
        }else{
            //列表不是NULL
            //1.创建一个新的节点
            //2.新节点的next指向NULL
            //3.lastNode->next 指向新节点
            //4.lastNode等于新节点
            temp = (LinkList)malloc(sizeof(Node));
            if(temp == NULL) exit(0);
            temp->data = number;
            temp->next = NULL;
            lastNode->next = temp;
            lastNode = temp;
        }
    }
    
    return OK;
}
  • 单链表插入

    • 前插法
    • 后插法
    • 任意位置插入

具体实现:

//插入元素
//1.找到插入位置的前驱节点target
//2.创建一个新节点temp并赋值
//3.temp->next指向target->next
//4.target->next指向temp
Status insert(LinkList *L,int item, int place){
    if(*L == NULL) return ERROR;
    if(place < 1) return ERROR;
    LinkList temp = NULL;
    LinkList target = NULL;
    temp = (LinkList)malloc(sizeof(LinkList));
    temp->data = item;
    if(temp == NULL) return ERROR;
    int i;
    for (i = 1, target = *L; i < place-1 && target != NULL; i++,target = target->next);
    if(i != place - 1) return ERROR;
    temp->next = target->next;
    target->next = temp;
    return OK;
}
  • 单链表删除


具体实现:

//删除元素
//1.找到插入位置的前驱节点target
//2.创建temp指向target->next
//3.target->next指向temp->next
//4.free(temp)

Status delete(LinkList *L,int place){
    if(*L == NULL) return ERROR;
    LinkList target = NULL;
    LinkList temp = NULL;
    int i;
    for (i = 1, target = *L; i < place-1 && target != NULL; i++,target = target->next);
    if(i != place - 1) return ERROR;
    if(target->next == NULL) return ERROR;
    temp = target->next;
    target->next = temp->next;
    free(temp);
    return OK;
}
  • 单链表查找

//查找内容
Status getElem(LinkList L, int place, ElemType *e){
    LinkList temp = NULL;
    int i = 1;
    for (temp = L; temp != NULL; temp = temp->next) {
        if(i == place){
            (*e) = temp->data;
            return OK;
        }
        i++;
    }
    return ERROR;
}
  • 单链表修改结点内容

//修改内容
Status modify(LinkList *L, int place, ElemType e){
    if(place < 1) return ERROR;
    LinkList temp = NULL;
    int i = 1;
    for (temp = *L; temp != NULL; temp = temp->next) {
        if(i == place){
            temp->data = e;
            return OK;
        }
        i++;
    }
    return ERROR;
}