链表\链表基础应用

简介: 链表\链表基础应用

文章有点长,不过每个分块都有标注啦~

之后的分文件虽然不难,但是一块一块讲起来有点麻烦

大家可以去参考一下文档(文档还是很详细的)

链表实际上就是指针的运用

可以想象成一节一节的火车,通过钩子连接,而这个钩子就是指针

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
 
//定义结构体
typedef struct Node
{
  int data;
  struct Node *next;
}Node;
 
//函数声明
Node *Create();
void Print(Node *head);
void Release(Node *head);
Node *Delete(Node *head,int num);
int que(char str[]);
Node *Insert(Node *head,int num);
 
int main()
{
  //初始化
  Node *head;
  char c;
  int ret1,ret2;
  char str[15]={0};
 
  //调用函数
  head=Create();
  Print(head);
 
  //删除数据(提示)
  strcpy(str,"delete?");
  ret1=que(str);
  //删除数据
  int bs;
  if(ret1==1)
  {
    printf("请输入想要删除的数据:");
    scanf("%d",&bs);
    Delete(head,bs);
    printf("删除后的");
  }
  else
    printf("已保持数据完整\n");
  Print(head);
 
  //插入数据(提示)
  int ret3;
  strcpy(str,"insert?");
  ret3=que(str);
  //插入数据
  int ins;
  if(ret3==1)
  {
    printf("请输入想要插入的数据:");
    scanf("%d",&ins);
    Insert(head,ins);
    printf("插入后的");
  }
  else
    printf("已保持数据完整\n");
  Print(head);
 
  //释放内存(提示)
  strcpy(str,"release?");
  ret2=que(str);
  //释放内存
  if(ret2==1)
    {
      printf("yes,you're right~\n");
      Release(head);
    }
    else
    {
      printf("不好意思,你莫得选择。\n");
      Release(head);
    }
 
  system("pause");
  return 0;
}
 
//函数定义
//生成链表
Node *Create()
{
  //链表初始化
  Node *head,*tail,*p;
  int num;
  head=tail=NULL;
 
  //输入数据个数
  int count=0;
 
  //输入数据
  printf("请输入数据(以-1结尾)");
  scanf("%d",&num);
 
  //逐个读取并建立链表
  while(num!=-1)
  {
    p=(Node*)malloc(sizeof(Node));
    p->data=num;
    p->next=NULL;
    if(head==NULL)
      head=p;
    else
      tail->next=p;
    tail=p;
    scanf("%d",&num);
  }
  return head;  
}
 
//输出
void Print(Node *head)
{
  Node *p;
  p=head;
  if(head==NULL)
    printf("链表为空!\n");
  else
  {
    printf("链表如下:\n");
    while(p!=NULL)
    {
      printf("%d ",p->data);
      p=p->next;
    }
  }
  printf("\n");
}
 
//释放
void Release(Node *head)
{
  Node *p1,*p2;
  p1=head;
  while(p1!=NULL)
  {
    p2=p1;
    p1=p1->next;
    free(p2); //一个一个释放
  }
  printf("链表释放成功!\n");
}
 
//删除
Node *Delete(Node *head,int num)
{
  Node *p1,*p2;
 
  if(head==NULL)
  {
    printf("链表为空!\n");
    return head;
  }
 
  p1=head;
  
  //循环查找
  while(p1->next && p1->data!=num)
  {
    p2=p1;
    p1=p1->next;
  }
 
  //找到
  if(p1->data==num)
  {
    if(p1==head)
      head=p1->next;
    else
      p2->next=p1->next;  //指针指向的交换
    free(p1); //p1被替代后即可释放
    printf("删除成功!\n");  //反馈
  }
  //没找到
  else
    printf("该数据不存在!\n");
  return head;
}
 
//提示
int que(char str[])
{
  int ret=0;
  char c;
  do{
    printf("%s\n",str);
    fflush(stdin);  //缓存区还有别的东西,吞掉
    scanf("%c",&c);
    getchar();  //吞掉回车
  }while(c!='y' && c!='Y' && c!='n' && c!='N');
  if(c=='y' || c=='Y')
    ret=1;
  return ret;
}
 
//插入
Node *Insert(Node *head,int num)
{
  //初始化
  Node *p,*p1,*p2;
 
  //把待插入的数据做成一节
  p=(Node*)malloc(sizeof(Node));
  p->data=num;
  p->next=NULL;
 
  //确定插入位置
  while(p1 && p->data>p1->data)
  {
    p2=p1;
    p1=p1->next;
  }
 
  //插入
  if(p1==head)
    head=p;
  else
    p2->next=p;
  p->next=p1;
  printf("数据插入成功!\n");
  return head;
}


目录
相关文章
|
3月前
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
71 10
【数据结构】链表从实现到应用,保姆级攻略
|
2月前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
3月前
|
前端开发 JavaScript C++
详解链表在前端的应用,顺便再弄懂原型和原型链!
该文章深入解析了链表在前端开发中的应用,并详细阐述了JavaScript中的原型和原型链的概念及其工作原理。
|
6月前
|
存储 算法
单链表的应用
单链表的应用
42 6
|
6月前
|
存储 算法 C语言
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
|
7月前
|
存储 调度 C语言
链表,栈,队列的区别及其应用
链表,栈,队列的区别及其应用
|
7月前
|
存储 算法 C语言
链表带头和不带头的区别及其应用
链表带头和不带头的区别及其应用
|
7月前
|
存储 C语言
链表—初始化指针变和创建新的节点------区别应用分析
链表—初始化指针变和创建新的节点------区别应用分析
|
7月前
单链表的应用
上篇博客中,我们学习了单链表,为了更加熟练掌握这一知识点,就让我们将单链表的应用操练起来吧!
58 0
|
7月前
|
存储 编译器 C语言
【数据结构】深入浅出理解链表中二级指针的应用
【数据结构】深入浅出理解链表中二级指针的应用
109 0