很早之前学的数据结构,放了很久后,以致对里面的一些操作都有些遗忘,故而再次温习了一下数据结构,并整理了一点儿笔记,放在这里和大家分享, 我的代码注释的已经很详细了,对于容易出错的地方我也都有标注,欢迎大家交流。

#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define ERROR 0//#define
typedef int Status;//函数返回的状态值类型
typedef int ElemType;
typedef struct Node
{ElemType data;struct Node *next;
} Node;//定义一个单链表存储结构

typedef struct Node *LinkList;//定义一个线性表,定义的是Node结构体的指针//创建一个具有n个元素的单链线性表,采用头插法创建,注意:其中已经包含了初始化操作
//初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用*L
//*L表示结构体指针的指针
Status List_Link_Create(LinkList *L,int n)//头插法
{LinkList p;*L =(LinkList) malloc(sizeof(Node));//产生一个头结点,并使得*L指向这个头结点,于是*L便是一个头指针,头指针是链表的必要元素if (L == NULL)return ERROR;(*L)->next = NULL;//使得头指针指向的内容为空,建立一个带头结点的单链表printf("请输出n个随机生成的数字:");for (int i = 0; i < n; i++){p = (LinkList)malloc(sizeof(Node));//生成新节点p->data = rand() % 100 + 1;//随机生成100以内的数字printf("%d", p->data);printf(" ");//字符与字符之间空格
        p->next = (*L)->next;(*L)->next = p;//插入到表头
    }printf("\n");//换行return OK;
}Status List_Link_Length(LinkList L)//求出单链表的长度
{int j = 0;LinkList p;p = L;while (p != NULL){p = p->next;j++;}printf("单链表当前的长度=%d",j);return j;
}
//Status List_Link_Ini(LinkList L)//初始化一个线性单链表
//{
//    L = (LinkList)malloc(sizeof(Node));//产生一个头结点,并使得L指向这个头结点,于是L便是一个头指针,头指针是链表的必要元素
//    if (L == NULL)
//        return ERROR;
//    L->next = NULL;//使得头结点的指针域为空
//    return OK;
//}//销毁链表L,释放链表L申请的内存,使L的值重新变为NULL,所以会改变L的值,得用*L
Status List_Link_Destory(LinkList *L)
{LinkList p,q;p = (*L)->next;while (p){q = p->next;free(p);p = q;}(*L)->next = NULL;//头节点的指针域为空return OK;
}Status List_Link_Insert(LinkList *L, int i, ElemType e)//在L中第i个元素之前插入新的数据元素e
{int j;LinkList p, s;p = *L;j = 1;while (p&&j<i)//遍历寻找第i个节点
    {p = p->next;++j;}if (!p || j > i)return ERROR;//第i个元素不存在s = (LinkList)malloc(sizeof(Node));//生成一个新节点s->data = e;s->next = p->next;//将p的后继节点赋值给s的后继p->next = s;printf("插入节点的元素的值为:%d\n", e);return OK;//插入成功

}//删除L的第i个数据元素,并用e返回其值
//注意这里是*e,而不是e,区别于插入当中的变量e
Status List_Link_Delete(LinkList *L, int i, ElemType *e)
{int j=1;LinkList p, q;p = *L;while (p->next&&j<i)//遍历寻找第i个元素
    {p = p->next;++j;}if (!(p->next) || j > i)return ERROR;//第i个元素不存在
q = p->next;//q表示即将被删除元素的节点*e = q->data;p->next = q->next;//将q    后继赋值给p的后继free(q);//q被利用完毕后,将q释放printf("删除第%d个节点的元素值为:%d\n", i, *e);return OK;}Status List_Link_GetElem(LinkList L, int i, ElemType *e)//取出单链表L中的第i个元素,并通过*e返回
{int j;LinkList p;p = L->next;//找到单链表L中第一个节点j = 1;while (p&&j < i){p = p->next;++j;}if (!p || j > i)return ERROR;//第i个元素不存在*e = p->data;//取出第i个元素的数据域并传值给*eprintf("被取出的元素的值为:");printf("%d\n", *e);return OK;
}
int main()//测试函数
{LinkList L1;ElemType f,h;List_Link_Create(&L1, 6);List_Link_GetElem(L1, 3, &f);List_Link_Insert(&L1, 3, 15);//在链表的第3个节点之前插入元素15List_Link_Delete(&L1, 3, &h);//删除链表的第3个节点的元素,并返回给h输出return OK;
}/*1.对于LinkList L : L是指向定义的node结构体的指针, 可以用->运算符来访问结构体成员, 即L->elem, 而(*L)就是个Node型的结构体了,
可以用点运算符访问该结构体成员, 即(*L).elem;2.对于LinkList *L:L是指向定义的Node结构体指针的指针, 所以(*L)是指向Node结构体的指针,
可以用->运算符来访问结构体成员, 即(*L)->elem, 当然, (**L)就是Node型结构体了, 所以可以用点运算符来访问结构体成员, 即(**L).elem;3.在链表操作中, 我们常常要用链表变量作物函数的参数, 这时, 用LinkList L还是LinkList *L就很值得考虑深究了,
一个用不好, 函数就会出现逻辑错误, 其准则是:如果函数会改变指针L的值, 而你希望函数结束调用后保存L的值, 那你就要用LinkList *L,
这样, 向函数传递的就是指针的地址, 结束调用后, 自然就可以去改变指针的值;而如果函数只会修改指针所指向的内容,
而不会更改指针的值, 那么用LinkList L就行了;*/

下面是我在vs2013中的测试结果:

请输出n个随机生成的数字:42 68 35 1 70 25
被取出的元素的值为:1
插入节点的元素的值为:15
删除第3个节点的元素值为:15
请按任意键继续. . .

转载于:https://www.cnblogs.com/huster666/p/5642638.html

单链表的初始化,整表创建,单个元素插入,单个元素删除,整表删除等操作...相关推荐

  1. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  2. C语言单链表实现初始化、创建、增、删、查等基本操作(详细)

    C语言单链表实现初始化.创建.增.删.查等基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h&g ...

  3. C语言-数据结构-单链表的初始化,插入和输出

    [问题描述] 设有头结点单链表,实现单链表的初始化.插入和输出算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000),一个M(N大于等于1,小于1000): 第二行输入N个整数,以空格作 ...

  4. 带头结点的单链表的初始化,建立,插入,查找,删除

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

  5. java实现hbase表创建、数据插入、删除表

    近日查看了相关资料后,梳理了一下用java实现hbase的表创建.数据插入.删除表,代码如下: 1.需要的jar包: commons-codec-1.4.jar commons-logging-1.0 ...

  6. mysql从一个表查出写入另一个表_sql语句 怎么从一张表中查询数据插入到另一张表中...

    展开全部 sql语句从一张表中查询数据插入到另一张表中的方法如下:e68a843231313335323631343130323136353331333365653762 1.select * int ...

  7. mysql将查询结果写入另一张表_将一张表的查询结果插入到另一张表(转)

    将一张表的查询结果插入到另一张表 方法一: 代码 1 select into 和 insert into select 两种表复制语句 2 select * into destTbl from src ...

  8. 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现

    写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...

  9. c语言判断顺序链表是否为空,数据结构之线性表(五)——单链表(2 初始化,判断空表,销毁,清空,求表长)...

    1.单链表(带头结点)的初始化 即,构造一个空表,如下图, 算法步骤: 1.生成新结点作头结点,用头指针L指向头结点. 2.将头指针的指针域置空. 算法描述: Status InitList_L(Li ...

最新文章

  1. STM32-USART控制led和蜂鸣器
  2. Subsonic设置--新手上路
  3. Spring学习(8)--- @Autowired注解(一)
  4. 给linux下网站目录配置SFTP
  5. css3实现超出文本指定行数(指定文本长度)用省略号代替
  6. python语言程序设计实验答案实验八函数_C++程序设计 实验8 实验报告 标准答案...
  7. 深挖前端 JavaScript 知识点 —— 史上最全面、最详细的 Cookie 总结
  8. 医药/医疗/互联网医疗服务平台/问诊/挂号/开药/处方/医生/医院/问诊订单管理/移动端问诊医疗系统/医生端处方开药系统/web端医药服务平台管理/axure原型/rp源文件/健康咨询/视频问诊/统计
  9. CREATE VIEW SQL:在SQL Server中使用索引视图
  10. java 表单字段扩展_如何从Chrome扩展程序填写网页表单中的文本字段?
  11. D1-H哪吒 设置hdmi分辨率
  12. ESAPI自定义配置文件路径
  13. Vue 遍历单项选择 答题卡
  14. Java多线程的简介
  15. eda交通灯控制器波形输入_EDA 基于quartus平台制作的步行街自助式交通灯控制器(含vhdl程序、波形图、及电路原理图)+课程设计报告...
  16. Pandas学习——文本数据
  17. QA | R做生存分析如何取最佳cutoff(截断)
  18. eCognition软件中ESP2插件的下载与安装
  19. 中国首次包揽2021年国际信息学奥赛(IOI 2021)前四名
  20. 这几年被分布式坑惨了,曝光十大坑

热门文章

  1. 查询字符串某个字符的个数
  2. C++之对象的动态建立和释放
  3. 【VBA编程】10.自定义集合
  4. 背景图片适应屏幕百分百
  5. iTunes“解决方案”发展历程及研究(上)
  6. Linux直接与编译安装Vsftpd服务器
  7. HttpClient和DefaultHttpClient
  8. python核心,内建函数,高阶函数
  9. 解决bash: mysql: command not found 的方法【linux mysql命令 】
  10. qtableview点击行将整行数据传过去_可以实时获取数据的Database Asset插件