20002.数据结构C++ 单向链表

简介: 20002.数据结构C++ 单向链表
# include<iostream>
typedef int ElemType;
typedef struct Lnode {
  ElemType data;
  struct Lnode* next;
}Lnode, *Linklist;
bool InitList_L(Linklist& L) {
  /*
    初始化单向链表。
  */
  L = new Lnode;
  if (!L)
    return false;
  L->next = NULL;
  return true;
}
bool CreateList_H(Linklist& L) {
  /*
    创建单向链表。
  */
  int x = 1;
  std::cout << "请输入您要插入的数字" << std::endl;
  std::cin >> x;
  while (x != -1) {
    /*
      使用头插法建立单向链表。
    */
    Linklist p;
    p = new Lnode;
    if (!L)
      return false;
    p->data = x;
    p->next = L->next;
    L->next = p;
    std::cout << "请输入您要插入的数字" << std::endl;
    std::cin >> x;
  }
  return true;
}
bool CreateList_T(Linklist L) {
  /*
    使用尾插法,建立单向链表。
  */
  int x;
  std::cout << "请输入您要插入的数字,-1表示结束" << std::endl;
  std::cin >> x;
  Linklist p, q;
  p = L; // 创建尾部指针。
  while (x != -1) {
    q = new Lnode;
    if (!q)
      return false;
    q->data = x;
    q->next = NULL;
    p->next = q;
    p = q;
    std::cout << "请输入您要插入的数字,-1表示结束" << std::endl;
    std::cin >> x;
  }
}
void PrintList(Linklist& L) {
  Linklist p;
  p = L->next;
  while (p != NULL) {
    std::cout << p->data << std::endl;
    p = p->next;
  }
}
bool GetElem_L(Linklist L, int i, int& e) {
  /*
    获取列表第i个元素的值
  */
  Linklist q;
  q = L->next;
  if (i < 1)
    return false;
  if (!q)
    return false;
  int j = 0;
  while (j < i - 1) {
    q = q->next;
    if (!q)
      return false;
    j++;
  }
  e = q->data;
  return true;
}
bool LocateElem_L(Linklist L, int e) {
  /*
    查找单向链表中的元素;
  */
  Linklist p;
  p = L;
  while (p && p->data != e) {
    p = p->next;
  }
  if (!p)
    return false;
  return true;
}
bool ListInsert_L(Linklist& L, int i, int e) {
  Linklist p, q;
  p = L->next;
  if (i < 1)
    return false;
  int j = 0;
  while (j < i - 2 && p) {
    p = p->next;
    j++;
  }
  if (j != i - 2)
    return false;
  q = new Lnode;
  q->data = e;
  q->next = p->next;
  p->next = q;
  return true;
}
bool ListDelete_L(Linklist& L, int i) {
  Linklist p, q;
  p = L->next;
  int j = 0;
  while (p && j < i - 2) {
    p = p->next;
    j++;
  }
  if (j != i - 2)
    return false;
  q = p->next;
  p->next = p->next->next;
  delete q;
  return true;
}
int main() {
  Linklist L;
  InitList_L(L);
  CreateList_H(L);
  //CreateList_T(L);
  int x, e;
  //std::cout << "请输入您要获取第几个元素的值" << std::endl;
  //std::cin >> x;
  //GetElem_L(L, x, e);
  //std::cout << "程序获取的元素为:" << e << std::endl;
  //std::cout << "请输入您要查找的数据" << std::endl;
  //std::cin >> e;
  //std::cout << LocateElem_L(L, e) << std::endl;
  //std::cout << "请输入您要插入元素的位置" << std::endl;
  //std::cin >> x;
  //std::cout << "请输入您要插入的元素" << std::endl;
  //std::cin >> e;
  //ListInsert_L(L, x, e);
  std::cout << "请输入您要删除元素的位置" << std::endl;
  std::cin >> x;
  ListDelete_L(L, x);
  PrintList(L);
  return true;
}
目录
相关文章
|
16天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
43 4
|
17天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
17天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
25 7
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
23 3
|
1月前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
16 0
数据结构与算法学习五:双链表的增、删、改、查
|
16天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
36 0
【数据结构】——双向链表详细理解和实现
【数据结构】——双向链表详细理解和实现
|
1月前
|
存储 Java
【数据结构】链表
【数据结构】链表
18 1
|
1月前
|
存储 缓存
数据结构3——双向链表
数据结构3——双向链表
112 1