单链表

2024 年 9 月 5 日 星期四(已编辑)
/ , ,
37
1
摘要
单链表
这篇文章上次修改于 2024 年 9 月 13 日 星期五,可能部分内容已经不适用,如有疑问可询问作者。

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

单链表

一.节点结构体定义

typedef int ElemType;

typedef struct LNode {
  ElemType data;
  struct LNode * next;
}*LinkList,LinkNode;

二.带有头结点的单链表

1.创建一个单链表

LinkList create(){
  LinkList L = (LinkList)malloc(sizeof(LinkNode));
  if(L == NULL){
    printf("error!\n");
    exit(-1);
  }
  L->next = NULL;
  return L;
}

2.遍历一个单链表

void print(LinkList L){
  LinkList p = L->next;
  while(p){
    printf("%d ",p->data);
    p = p->next;
  }
}

3.创建一个节点

LinkNode *createNode(ElemType data){
    LinkNode * LN = (LinkNode*)malloc(sizeof(LinkNode));
  if(LN == NULL){
  printf("error!\n");
    exit(-1);
  }
  LN->data = e;
  return LN;
}

4.插入数据

1.头插法
void insertByHead(LinkList L,ElemType e){
  LinkNode * LN = createNode(e);
  LN->next = L->next;
  L->next = LN;
}
2.尾插法
void insertByEnd(LinkList L,ElemType e){
  LinkNode *p = L->next;
  while(p->next){p = p->next;}
  LinkNode *LN =  createNode(e);
  p->next = LN;]
  LN->next = NULL;
}

4.删除节点

void deletNodeBydata(LinkList L,ElemType e){
    LinkNode *p = L;
    LinkNode *ptr = L->next;
    
    while(ptr){
        if(ptr->data == e){
            p->next = ptr->next;
            free(ptr);
            return;
        }
        p = ptr;
        ptr = ptr ->next;
    }
}

5.删除链表


void deletList(LinkList L) {
    LinkNode *p = L->next;
    LinkNode *temp;
    while (p) {
        temp = p->next;
        free(p);
        p = temp;
    }
    L->next = NULL; 
}

三.没有头结点的单链表

四.完整代码

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

typedef  int ElemType;

typedef struct LNode {
    ElemType data;
    struct LNode * next;
}*LinkList,LinkNode;

// 创建一个链表
LinkList create(){
    LinkList L = (LinkList)malloc(sizeof(LinkNode));
    if(L == NULL){
        printf("error!\n");
        exit(-1);
    }
    L->next = NULL;
    return L;
}

int is_empty(LinkList L){
    return L->next == NULL;
}

// 便利链表
void print(LinkList L){
    LinkList p = L->next;
    while(p){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

//创建一个节点
LinkNode *createNode(ElemType e){
    LinkNode * LN = (LinkNode*)malloc(sizeof(LinkNode));
    if(LN == NULL){
        printf("error!\n");
        exit(-1);
    }
    LN->data = e;
    return LN;
}

// 头插法
void insertByHead(LinkList L,ElemType e){
    LinkNode * LN = createNode(e);
    LN->next = L->next;
    L->next = LN;
}

// 尾插法
void insertByEnd(LinkList L,ElemType e){
    LinkNode *p = L->next;
    while(p->next){p = p->next;}
    LinkNode *LN =  createNode(e);
    p->next = LN;
    LN->next = NULL;
}

// 删除元素通过元素值
void deleteNodeBydata(LinkList L,ElemType e){
    LinkNode *p = L;
    LinkNode *ptr = L->next;
    
    while(ptr){
        if(ptr->data == e){
            p->next = ptr->next;
            free(ptr);
            return;
        }
        p = ptr;
        ptr = ptr ->next;
    }
}

void deletList(LinkList L) {
    LinkNode *p = L->next;
    LinkNode *temp;
    while (p) {
        temp = p->next;
        free(p);
        p = temp;
    }
    L->next = NULL; 
}


int main(){
    // 创建一个链表
    LinkList L = create();
    insertByHead(L,1);
    insertByHead(L,2);
    insertByHead(L,3);
    insertByEnd(L,190);
    deleteNodeBydata(L,1);
    print(L);
    deletList(L);
    printf("%d\n",is_empty(L));
    
    return 0;
}

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...