单链表

作者: qianranow | 来源:发表于2018-09-11 17:34 被阅读6次

0. 顺序存储结构


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

#define MAXSIZE 20

typedef struct Node {
  
  int Data[MAXSIZE];
  
  int Last;
  
}LNode, *List;

List MakeEmpty() {
  
  List PtrL;
  
  PtrL = (List)malloc(sizeof(LNode));
  
  PtrL -> Last = -1;
  
  return PtrL;
  
}

int Find(int X, List PtrL) {
  
  int i = 0;
  
  while (i <= PtrL -> Last && PtrL -> Data[i] != X) { // 根据索引找元素
    
    i++;
    
  }
  
  if (i > PtrL -> Last) { // 没有找到返回 -1
    
    return -1;
    
  } else { // 找到后返回存储位置
    
    return i;
    
  }
  
}

void Insert(int X, int i, List PtrL) {
  
  if (PtrL -> Last == MAXSIZE - 1) {
    
    printf("表满");
    
    return;
    
  }
  
  if (i < 1 || i > PtrL -> Last + 2) {
    
    printf("插入位置不合法");
    
    return;
    
  }
  
  for (int j = PtrL -> Last; j >= i - 1; j--) {
    
    // 元素倒叙向后移动
    PtrL -> Data[j + 1] = PtrL -> Data[j];
    
  }
  
  // 新元素插入
  PtrL -> Data[i - 1] = X;
  
  PtrL -> Last++;
  
  return;
  
}

void Delete(int i, List PtrL) {
  
  if (i < 1 || i > PtrL -> Last + 1) {
    
    printf("不存在第 %d 个元素\n", i);
    
    return;
    
  }
  
  for (int j = i; j <= PtrL -> Last; j++) {
    
    PtrL -> Data[j - 1] = PtrL -> Data[j];
    
  }
  
  PtrL -> Last--;
  
  return;
  
}

1. 链式存储结构


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

typedef struct Node {
  
  int Data;
  
  struct Node *Next;
  
}LNode, *List;

int Length(List PtrL) {
  
  // 第一个结点
  List p = PtrL;
  
  int i = 0;
  
  while (p) {
    
    p = p -> Next;
    
    i++;
    
  }
  
  return i;
  
}

List FindKth(int K, List PtrL) {
  
  // 第一个结点
  List p = PtrL;
  
  int i = 1;
  
  while (p != NULL && i < K) {
    
    p = p -> Next;
    
    i++;
    
  }
  
  if (i == K) {
    
    return p;
    
  } else {
    
    return NULL;
    
  }
  
}

List Find(int X, List PtrL) {
  
  List p = PtrL;
  
  while (p != NULL && p -> Data != X) {
    
    p = p -> Next;
    
  }
  
  return p;
  
}

List Insert(int X, int i, List PtrL) {
  
  List p, s;
  
  if (i == 1) { // 插在头指针
    
    s = (List)malloc(sizeof(LNode));
    
    s -> Data = X;
    
    s -> Next = PtrL;
    
    return s;
    
  }
  
  // 查找第 i - 1 位置结构体指针
  p = FindKth(i - 1, PtrL);
  
  if (p == NULL) {
    
    printf("参数 i 错误");
    
    return NULL;
    
  } else {
    
    s = (List)malloc(sizeof(LNode));
    
    s -> Data = X;
    
    s -> Next = p -> Next;
    
    p -> Next = s;
    
    return PtrL;
    
  }
  
}

List Delete(int i, List PtrL) {
  
  List p, s;
  
  if (i == 1) {
    
    s = PtrL;
    
    if (PtrL != NULL) {
      
      PtrL = PtrL -> Next;
      
    } else {
      
      return NULL;
      
    }
    
    free(s);
    
    return PtrL;
    
  }
  
  p = FindKth(i - 1, PtrL);
  
  if (p == NULL) {
    
    printf("第 %d 个结点不存在", i - 1);
    
    return NULL;
    
  } else if (p -> Next == NULL) {
    
    printf("第 %d 个结点不存在", i);
    
    return NULL;
    
  } else {
    
    s = p -> Next;
    
    p -> Next = s -> Next;
    
    free(s);
    
    return PtrL;
    
  }
  
}

相关文章

  • 单链表 C++

    单链表 C++ 题目 1、创建单链表2、初始化单链表3、释放单链表4、获取单链表中元素的数量5、输出单链表中的所有...

  • 线性表:顺序表和链表

    顺序表(数组)优缺点 链表优点 单链表使用 单链表结构 单链表初始化 单链表初始化 单链表建立: 头插法 尾插法 ...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • 线性表的链式存储-单链表

    单链表操作 [x] 单链表的创建(尾插法、头插法) [x] 单链表的查找操作 [x] 单链表的删除操作 [x] 单...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 单链表反转

    单链表 单链表反转 递归方法

  • JavaScript数据结构2——单链表

    以下的代码包括了以下几部分 单链表初始化 单链表的插入 单链表的删除 单链表的创建(头插法) 单链表的创建(尾插法...

  • 链表

    链表:通过“指针”将零散的内存块联系起来。常见链表结构:单链表、循环链表和双链表。 单链表 对比数组学习单链表 循...

网友评论

      本文标题:单链表

      本文链接:https://www.haomeiwen.com/subject/kenugftx.html