数据结构C语言版--单链表的基本功能实现
/*
* 构造一个链式存储的线性表(当输入9999时,结束构造过程),然后输出该线性表
* 并统计该线性链表的长度 。
*注:new和delete是C++的运算符
malloc和free是C++/C的标准库函数
*/
#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//单链表的存储结构
struct LinkNode{
int data; //节点的数据域
struct LinkNode *next; //节点的指针域
};
//1.打印输出,链表的数据,其中链表指向头节点
void print(LinkNode *L){
LinkNode *p; //定义一个指针变量p
p = L->next; //使p指向链表L的第一个数据
while(p != 0){
printf("%d、",p->data);
p = p->next; //指针后移
}
printf("\n"); //换行
}
//2.链表长度
int Length_LinkList(LinkNode *L){
LinkNode *p; //定义一个指针变量
int len = 0; // 定义一个计数器,计算节点个数
p = L->next; //指针P指向链表的第一个节点
while(p != NULL){
len++ ;
p = p->next; //指针后移,即指向当前节点的后继节点
}
return len; //返回链表长度
}
//3.按位置查找,单链表中寻找第i个元素,返回指向第i个节点的指针
LinkNode* FindI_LinkNode(LinkNode *L,int i){
LinkNode *p; //定义指针变量
int j = 1; //定义计数器
p = L->next; //让p指向头节点
while(j < i){ //当没有找到第i个节点
p = p->next; //指针后移
j++; //计数器加一
}
return p;
}
//4.按值查找,单链表中寻找元素e,返回元素e所在的位置
int FindE_LinkNode(LinkNode* L,int e){
LinkNode *p;
int count=0;
p=L->next;
while(p != NULL)
{
count++;
if(p->data==e)
return (count);
p=p->next;
}
return 0;
}
//5.在表头插入数据
int Insert_head(LinkNode* &L,int x){
//在以H为头节点的单链表中在头节点后插入数据
LinkNode *t; //定义指针
t = new LinkNode; //申请空间
t->data = x; //向新节点中写入数据
t->next = L->next; //把链表的第一个节点的地址写入到新节点中,也就是新节点的指针域置为null
L->next = t; //让头节点的next指针指向新节点 ,把新节点接到链表上
return OK;
}
//6.在表尾插入数据
int Insert_end(LinkNode *L,int x){
LinkNode *t;
t = new LinkNode; //申请空间
t->data = x; //把数据赋到新节点的数据域
while(L->next != NULL){//当链表不为空时,指针向后移动,因为数据要插入最后一个位置
L = L->next; //指针向后移动
} //直到指针移到最后一个
L->next = t; //将链表末尾节点的下一节点指向新节点
t->next = NULL; //新节点的指针域置空
return OK;
}
//7.在第i个位置插入数据
int Insert_LinkNode(LinkNode *L,int i,int x){
if(i < 1 || i > Length_LinkList(L)){
printf("插入位置错误!\n");
return ERROR;
}
LinkNode *p;
if(i == 1)
p = L; //指针P指向头节点
else
p = FindI_LinkNode(L,i-1); //让P指向第i-1个节点
Insert_head(p,x); //将x插入假设以p节点为头节点的链表中
return OK;
}
//8.删除首元节点
int Del_Head(LinkNode *L){
if(L->next != NULL){
LinkNode *p; //定义一个指针变量
p = L->next; //指针p指向第一个节点,p->next指向下一个节点
L->next = p->next; //头节点的指针域存储第二个节点的地址
delete p; //删除第一个节点,释放空间
}else{
printf("空表!\n");
return FALSE;
}
}
//9.删除表尾节点
int Del_End(LinkNode *L){
if(L->next != NULL){
LinkNode *p;
LinkNode *q;
int i;
p = L->next; //指针p指向第一个节点
for(i = 1;i < Length_LinkList(L) - 1;i++){
p = p->next;
}
q = p->next;
p->next = NULL;
//free(q);
delete q;
}else{
printf("空表!");
}
}
//10.删除指定位置上的元素
int Del_i(LinkNode* L,int i){
if(i<1 || i>Length_LinkList(L))//如果删除位置不合法
{
printf("删除位置不合法!");
return 0;
}
LinkNode *p;
if(i==1)
p=L; //让p指向头结点
else
p=FindI_LinkNode(L,i-1); //让p指向第i-1个结点
Del_Head(p); //删除以p为头结点的链表的第一个数据结点
return OK;
}
/*
* 在主函数中传递参数,传参分为值传递和址传递,
*/
int main(){
int i,x,count,m;
LinkNode *H; //定义链表指针
LinkNode *add;
H = new LinkNode; //申请空间
//H->data = -1; //为成员变量数据赋值
H->next = NULL; //为成员变量指针赋值
printf("输入数据:\n");
while(1){
scanf("%d",&i);
if(i == 9999){
break;
}else{
Insert_end(H,i); //插入数据
}
}
printf("The LinkNode elem is:");
print(H); //输出数据
printf("1.请输入从表头插入的数据:");
scanf("%d",&i);
Insert_head(H,i);
printf("The LinkNode elem is:");
print(H);
printf("2.请输入从表尾插入的数据:");
scanf("%d",&i);
Insert_end(H,i);
printf("The LinkNode elem is:");
print(H);
printf("3.请输入要插入的位置、数据(空格隔开):\n");//判断输出的插入位置是否合法
scanf("%d %d",&i,&x);
Insert_LinkNode(H,i,x);
printf("The LinkNode elem is:");
print(H);
printf("4.请输入要查询的位置:");
scanf("%d",&i);
if(i < 1 || i > Length_LinkList(H)){ //若查询位置不合法,返回error
printf("查询位置不合法!\n");
}else{
add = FindI_LinkNode(H,i);
int e = add->data;
printf("位置:%d的数据是:%d\n",i,e);
}
printf("4.请输入要查询的元素:\n");
scanf("%d",&i);
m = FindE_LinkNode(H,i);
if(m == 0){
printf("查无此元素!\n");
}else{
printf("数据:%d所在的位置是:%d\n",i,m);
}
Del_Head(H);
printf("5.删除首元节点后:\nThe LinkNode elem is:");
print(H);
Del_End(H);
printf("6.删除表尾节点后:\nThe LinkNode elem is:");
print(H);
printf("7.指定删除节点的位置:\n");
scanf("%d",&i);
if(i < 1 || i > Length_LinkList(H)){ //若查询位置不合法,返回error
printf("指定位置不合法!\n");
}else{
Del_i(H,i);
printf("6.删除指定节点后:\nThe LinkNode elem is:");
print(H);
}
count = Length_LinkList(H);
printf("8.此链表长度为:%d\n",count);
return 0;
}
数据结构C语言版--单链表的基本功能实现的更多相关文章
- c语言版单链表
1 //c语言单链表 2 #include <stdio.h> 3 #include <stdlib.h> 4 typedef struct Node 5 { 6 int da ...
- 数据结构_C语言_单链表
# include <stdio.h> # include <stdbool.h> # include <malloc.h> typedef int DataTyp ...
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
随机推荐
- centos系统初始化流程及实现系统裁剪
Linux系统的初始化流程: POST:ROM+RAM BIOS: Boot Sequence MBR: 446:bootloader 64: 分区表 2: 5A kernel文件:基本磁盘分区 /s ...
- Jenkins构建次数设置
Build after other projects are built:在其他项目触发的时候触发,里面有分为三种情况,也就是其他项目构建成功.失败.或者不稳定的时候触发项目: Poll SCM:定时 ...
- Node.js ECONNREFUSED错误
1 现象 node服务器 遇见此错误,如下:events.js:71throw arguments[1]; // Unhandled 'error' event^Error: connect ECON ...
- 树形插件 --- zTree
地址:http://www.treejs.cn/v3/api.php
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
- SpringMVC(2):Spring MVC入门
原文出处: 张开涛 2.1.Spring Web MVC是什么 spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思 ...
- WAP、触屏版网站及APP的区别
1.电脑版网站: 电脑版网站是指用户通过台式或者笔记本电脑浏览器打开的网站,也就是我们平时上网所访问的网站.其支持和兼容IE6.IE7.IE8.IE9.IE10.Firefox.Chrome等各种主 ...
- hdu 1542 线段树+扫描线 学习
学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...
- springMVC3学习--ModelAndView对象(转)
原文链接:springMVC3学习(二)--ModelAndView对象 当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherS ...
- python 全栈开发,Day28(复习,os模块,导入模块import和from)
一.复习 collections 增加了一些扩展数据类型 :namedtuple orderdict defaltdict队列和栈time 时间 三种格式 : 时间戳 结构化 字符串random 随机 ...