数据结构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语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
随机推荐
- lvs持久连接及防火墙标记实现多端口绑定服务
lvs持久连接及防火墙标记实现多端口绑定服务 LVS持久连接: PCC:将来自于同一个客户端发往VIP的所有请求统统定向至同一个RS: PPC:将来自于一个客户端发往某VIP的某端口的所有请求统统定向 ...
- 转载:编译安装Nginx(1.5.1)《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19618.html 1.5 configure详解 可以看出,configure命令至关重要,下文将详细介绍如何使用configure ...
- 如何利用github打造个人博客专属域名(文字版本)
1. 前言 此篇文章仅限于记录,不适合作为教程使用. 2. 步骤 2.1 先决条件 有github账号,有个人域名(可在万网购买),电脑本地安装有git环境 2.2 在github新建仓库.例如我的g ...
- php -- 魔术方法、魔术常量 简单介绍
魔术方法:PHP把类中所有以__(两个下划线)开头的方法当成魔术方法,一般建议用户不要将自定义的方法前面加上__作为前缀.魔术方法: 1. __construct() 类的默认构造方法,如果__con ...
- 使用JDBC连接数据库报“找不到驱动程序”错误解决
1.jre安装不成功: 2.jre中没有数据库驱动(D:\jre\lib\ext 中查看)
- react之自定义迷你redux的实现
export function createStore(reducer){ let currentState={} let currentListeners=[] function getState( ...
- Laravel Form 表单的数据校验
例如,要使用手机号加验证码的方式提供登录网站的功能,那么在处理前端提交的 form 表单时,就不得不对提交的手机号及验证码做基本的数据校验. 手写规则,非常浪费时间.使用 laravel 内置的 va ...
- hdu6107 倍增法st表
发现lca的倍增解法和st表差不多..原理都是一样的 /* 整篇文章分成两部分,中间没有图片的部分,中间有图片的部分 分别用ST表求f1,f2表示以第i个单词开始,连续1<<j行能写多少单 ...
- iOS中按钮点击事件处理方式
写在前面 在iOS开发中,时常会用到按钮,通过按钮的点击来完成界面的跳转等功能.按钮事件的实现方式有多种,其中 较为常用的是目标-动作对模式.但这种方式使得view与controller之间的耦合程度 ...
- 有关cookie
cookie 会话跟踪技术 <script> /* cookie 全称 会话跟踪技术. ...