数据结构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语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
随机推荐
- centos6.5下编译安装mariadb-10.0.20
源码编译安装mariadb-10.0.20.tar.gz 一.安装cmake编译工具 跨平台编译器 # yum install -y gcc* # yum install -y cmake 解决依赖关 ...
- WM8960音频播放
第一节 音频播放原理首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子: http://www.arm9home.net/read.php?tid=205 ...
- Expm 1_2 实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
package org.xiu68.exp.exp1; public class Exp1_2 { //实现快速排序算法,采用不同的方法实现线性划分的过程 public static void mai ...
- Javascript之BOM与DOM讲解
一.Javascript组成 JavaScript的实现包括以下3个部分: ECMAScript(核心) 描述了JS的语法和基本对象. 文档对象模型 (DOM) 处理网页内容的方法和接口 浏览器对象模 ...
- 前端组件库 - 搭建web app常用的样式/组件等收集列表(移动优先)
0. 前端自动化(Workflow) 前端构建工具 Webpack - module bundler Yeoman - a set of tools for automating developmen ...
- python接口自动化测试十三:url编码与解码
# url编码与解码 from urllib import parse url = 'http://zzk.cnblogs.com/s/blogpost?Keywords=中文' a = '中文' b ...
- web中切图、快速切图与web雪碧图制作的方法
声明: web小白的笔记,欢迎大神指点,联系QQ:1522025433. 工具:Photoshop 1.复制文字:点击文章工具后选择文字. 2.矩形选框工具 看信息 f8, 取消矩形选框 Ctrl+D ...
- Python 2维数组90度旋转
一.二维列表 a = [[col for col in range(4)] for row in range(4)] [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3] ...
- Unity 之 如何删除Unity项目里面没用的东西??
选中需要用到的Scene,右键选 Select Dependencies,这样会选出这个场景所有用到的文件,将这些文件导出为 .unitypackage. 用同样的办法就所有用到的几个场景的文件分别导 ...
- (转)java面试总结-(hibernate ibatis struts2 spring)
说说Hibernate对象的三种状态 Hibernate对象有三种状态,分别是:临时态(Transient). 持久态(Persistent).游离态(Detached). 临时状态:是指从对象通过n ...