//带头结点的单链表的初始化,建立,插入,查找,删除
    #include <stdio.h>
    #include <stdlib.h>

typedef int ElemType;//定义数据域类型  
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

结构体中的 typedef struct Node 的意思就是,为自定义的数据类型定义一个新名字 Node。
//定义结点类型(由数据域,指针域组成)和链表LinkList/
    typedef struct Node
    {
      ElemType data;     //单链表的数据域
      struct Node *next;  //单链表的指针域
     }Node,*LinkedList;           
关于结构体 struct Node *next; 这么一句代码,为什么要这么写?我写成 int *next 行不行?
不行的。next是指向下一个Node,所以其类型必须是Node。int *next 只能指向int,而不能指向Node。所以必须定义为 Node 类型,但是 Node 是结构体,所以前面还得加上个 struct。

//单链表的初始化/
    LinkedList LinkedListInit()
    {
      Node *L;
      L=(Node *)malloc(sizeof(Node));  //申请结点空间
      if(L==NULL)                 //判断是否有足够的内存空间
       printf("申请内存空间失败");
       L->next=NULL;              //将next设置为NULL,初始长度为0的单链表.com
      }

//单链表的建立1,头插法建立单链表/
     LinkedList LinkedListCreateH()
    {
     Node *L;
     L=(Node *)malloc(sizeof(Node));   //申请头结点空间
     L->next=NULL;       //初始化一个空链表
     ElemType x;    //x为链表数据域中的数据
     while(scanf("%d",&x)!=EOF)
     {
       Node *p;
       p=(Node *)malloc(sizeof(Node));  //申请新的结点
       p->data=x;      //结点数据域赋值
       p->next=L->next;    //将结点插入到表头
       L->next=p;
      }
     return L;
    }

//单链表的建立2,尾插法建立单链表/
LinkedList LinkedListCreateT()
{
 Node *L;
 L=(Node *)malloc(sizeof(Node));    //申请头结点空间
 L->next=NULL;    //初始化一个空链表
 Node *r;
 r=L;                  //r始终指向终端结点,开始时候指向头结点
ElemType x;                       //x为链表数据域中的数据
 while(scanf("%d",&x)!=EOF)
 {
   Node *p;
   p=(Node *)malloc(sizeof(Node));       //申请新的结点
   p->data=x;
   r->next=p ;
   r=p;
 }
 return L;
}

//单链表的插入,在链表的第i个位置插入x的元素
     LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)
     {
       Node *pre;      //pre为前驱结点
       pre=L;
       int temi=0;
       for(temi=1;temi<i;temi++)
        pre=pre->next ;     //查找第i个位置的前驱结点
      Node *p;
      p=(Node *)malloc(sizeof(Node));
      p->data=x;
      p->next=pre->next;   
      pre->next=p;
      }
      return L;
    }

//单链表的删除,在链表中删除值为x的元素
    LinkedList LinkedListDelete(LinkedList L,ElemType x)
    {
      Node *p ,*pre;         //pre为前驱结点,p为查找的结点;
      p=L->next;
      whiel(p-<data!=NULL)
     {
       pre=p;
      p=p->next;
    }
     pre->next=p->next;            //删除操作,将其前驱的next指向其后继
    free(p);
    return L;
    }

int main()  
{  
    LinkedList list,start;  
   printf("请输入单链表的数据:");   
    list = LinkedListCreatT();  
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
    int i;  
    ElemType x;  
    printf("请输入插入数据的位置:");  
    scanf("%d",&i);  
    printf("请输入插入数据的值:");  
    scanf("%d",&x);  
    LinkedListInsert(list,i,x);  
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
    printf("请输入要删除的元素的值:");  
    scanf("%d",&x);  
    LinkedListDelete(list,x);   
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
      
    return 0;  
}

//题外话:
    //带头结点初始化

Node *head;  //声明头结点
         void InitList(Node **head)
                {
               *head=(Node *)malloc( sizeof(Node));
               (*head)->next=NULL;
            }
    //不带头结点初始化

方式一:
        void InitList(Node **head){
            *head=NULL;
        }

调用InitList(&head);

方式二:
        void InitList(Node *head){
            head=NULL;
        }

//带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。

相关知识拓展:
 malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!
什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放。

转载于:https://www.cnblogs.com/God-boy1/p/3596532.html

带头结点的单链表的初始化,建立,插入,查找,删除相关推荐

  1. 不带头结点的单链表操作

    不带头结点的单链表操作,包括插入.遍历.统计结点数等,要求写出数据结构算法思想及C语言实现函数 本文为博主原创文章,未经博主允许不得转载. 版权为陈博超所有,第一次于2021年06月22日发表于BLO ...

  2. 建立带头结点的单链表

    [问题描述] 设有头结点单链表,实现单链表建立算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000): 第二行输入N个整数,以空格作为分隔,创建长度为N的单链表. [输出形式] 输出建立 ...

  3. 不带头结点的单链表的建立

    建立该链表利用的是尾插法 // 创建一个单链表,没有头结点, #include <iostream> #include <ctime>using namespace std; ...

  4. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  5. 数据结构c/c++ 头插法尾插法建立带头结点的单链表,以数组创建带头结点的单链表和不带头结点的单链表,输出打印单链表

    // // Created by 焦娇 on 2021/9/17. //#ifndef CHAPTER2_LINELINK_LLK_H #define CHAPTER2_LINELINK_LLK_H# ...

  6. 【C语言】数据结构C语言版 实验2 不带头结点的单链表

    运行环境:Dev-C++ vs2013可能不能运行 首先新建一个头文件slnklist.h #include <stdio.h> #include <stdlib.h> /** ...

  7. 单链表创建之--头插法创建带头结点的单链表

    单链表常见的创建方法有头插法和尾插法,这里记录头插法创建带头结点的单链表具体过程: 以C语言为例, 1)首先使用 typedef 关键字定义结点数据类型 typedef struct LNode{in ...

  8. 【考研】分清带头结点和不带头结点的单链表

    CSDN话题挑战赛第2期 参赛话题:学习笔记 前言 为分清带结点与不带头结点的单链表操作,本文以图文和表格形式描述了两者之间的区别.考研中,数据结构的单链表操作是重要考点,其中,比较常考带头结点的链表 ...

  9. 2.3 带头结点的单链表:理论+编程实战(C语言详细)

    1.顺序存储:线性表/栈/队列:理论+C语言实现–详细 2.1 链式存储概述 和 2.2 线性表的链式存储–单链表(C语言详细实现) 文章目录 2.3 带头结点的单链表 1. 带头结点的单链表基本概念 ...

最新文章

  1. 如何使用R来连接各个数据库
  2. 你知道JVM内存的那些事吗?
  3. lecture 4 : More Objective-C
  4. WCF 客户端连接慢
  5. js 控制文件名与文件大小
  6. springmvc的ModelAttribute注解
  7. 为什么用c语言程序中的if语句实现从1加到100最后的结果是负数,用C语言程式计算从1加到100的程式是怎样的?...
  8. 报数(约瑟夫环问题)
  9. 卸载windows激活码
  10. 【数据库】解剖式学习无损分解
  11. 如何打造一款火遍国内外的自走棋手游?我们跟《战歌竞技场》的美术和程序聊了聊
  12. 【安卓】安卓集成魔窗-完整实例
  13. read函数和write函数
  14. lr_think_time()
  15. c语言坦克大战程序设计,C语言坦克大战源码分析
  16. Polar SC的C语言实现之译码篇
  17. oracle表启用online,Oracle 表空间联机(online)与脱机(offline)
  18. UTF-8有BOM和无BOM的区别
  19. iOS程序启动原理---iOS-Apple苹果官方文档翻译
  20. 帆软报表动态数据源插件2.0使用教程

热门文章

  1. HTC S710D(电信版)G11解锁,成功ROOT
  2. 图书封面的故事之——“巴别塔”选自《七周七语言:理解多种编程范型》
  3. 分享最新40款免费的 WordPress 主题(上篇)
  4. UcSTAR统一通信平台
  5. Tell me why -- Declan Galbraith
  6. tpcc-mysql percona_tpcc-mysql 对percona5.6进行压力测试
  7. redis实例python_使用python操作redis(管道)
  8. hbase导入csv文件_HBase 数据导入 ImportTsv
  9. SpringMVC注解驱动开发
  10. html分页 css,js+css实现的简单易用兼容好的分页