复习下C 链表操作(单向链表)
Object-C 作为C 的包装语言(运行时、消息机制)。如果不熟悉C 的话实在玩得太肤浅。 随便深入oc 内部都会接触到C。
runtime 、GCD、Block、消息机制。。。
所有强大的功能无不用的 包装体(struct 结构体)。使用GCC/Clang (可以google 下。Clang 比GCC 更优化,) 编译指令。 转换OC 为 C 。
终端 使用Clang 命令参考
clang -rewrite-objc file.m
查看file.cpp 文件为编译转换的C
单向链表 创建 、插入 、反转
//struct
#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct Student_st
{
char name[];
int point;
struct Student_st *stu;
} Student; void CheckIsLinkTable(Student *student){
Student *next = student->stu;
if (next == NULL) {
printf("查询失败,不是链式结构\n");
exit();
}
} Student * CreateLink_Table(int num){
printf("num is %d\n",num); Student * head,*current,*temp;
//分配内存
head = (Student *)malloc(sizeof(Student));
if (head == NULL) {
printf("内存分配失败 \n");
exit();
} head ->name[] = '\0';
head ->point = ;
head -> stu = NULL; temp = head;
for (int i = ; i< num; i++) {
current = (Student *)malloc(sizeof(Student));
if (current == NULL) {
printf("内存分配失败 \n");
exit();
}
current ->stu = NULL; printf("请输入第%d位学生姓名和成绩 如:name|89 \n",i+);
char stuName[] = "未知";
int student_point = ;
char argValue[] = "未知"; scanf("%s",argValue); if (strstr(argValue,"|")==NULL) {
printf("请使用|分割内容 Y|N Y 重新输入,N 退出\n");
char content[];
scanf("%s",content);
if (strcmp(content,"Y")==) {
scanf("%s",argValue);
}else{
exit();
}
} //分割字符串
char *token; token = strtok(argValue,"|");
int i = ;
while (token != NULL) {
if (i>) {
student_point = atoi(token);
printf("%d\n",student_point);
}else{
////char*的值赋给数组怎么做?----> c是常量指针,不可以改变,用
strncpy(stuName,token,sizeof(stuName));
printf("%s\n",token);
} token = strtok(NULL,"|");
i++;
}
strncpy(current->name,stuName,sizeof(current->name));
current ->point = student_point; current->stu = NULL;
temp ->stu = current;
temp = current; } return head;
} //查询
void selectStudent(Student *student){
CheckIsLinkTable(student); Student *next = student->stu;
int i =;
while (next) {
printf("index %d; studentName is %s; point is %d\n",i+,next->name,next->point);
next = next ->stu;
i++;
}
}
//插入
Student * insertStudentLinkTable(Student *student,char *insertContent){
//分割字符串
if (!insertContent) {
exit();
} //分割字符串
char *token;
char stuName[];
char preStuName[];
int student_point;
token = strtok(insertContent,"|");
int i = ;
while (token != NULL) {
if (i==) {
////char*的值赋给数组怎么做?----> c是常量指针,不可以改变,用
strncpy(stuName,token,sizeof(stuName));
printf("%s\n",token);
}else if(i==){
student_point = atoi(token);
printf("%d\n",student_point);
}else{
strncpy(preStuName,token,sizeof(preStuName));
printf("%s\n",token);
} token = strtok(NULL,"|");
i++;
}
Student *preStu; CheckIsLinkTable(student);
//查找节点名字是否存在
Student *next = student->stu;
int ind = ;
while (next) {
if ((next->name) && strcmp(preStuName,next->name)==) {
printf("找到节点%s 位于第%d个节点 开始插入节点\n",preStuName,ind+);
preStu = next;
break;
}
next = next->stu;
ind++;
} Student *nextStu = preStu->stu;
//创建节点
Student *newStu = (Student *)malloc(sizeof(Student));
if (newStu==NULL) {
printf("分配内存失败");
exit();
}
strncpy(newStu->name,stuName,sizeof(char[]));
newStu->point = student_point;
newStu->stu = nextStu; preStu->stu = newStu; //查询节点
selectStudent(student);
return student;
} //反转
Student *ReversionStudentLinkTable(Student *student){
CheckIsLinkTable(student); Student *next,*current,*newLinkTable;
next = NULL;
current =NULL;
newLinkTable = NULL;
current = student->stu;
while (current) {
//保存游标节点 以后的节点
next = current->stu;
//断开游标节点后面的节点,并设置游标节点的后续节点为 新链表的第一个节点
current->stu = newLinkTable;
//保存当前游标节点 为新链表
newLinkTable = current;
//重置游标节点
current = next;
} //给游标节点添加 头节点
Student *head = NULL;
head = (Student *)malloc(sizeof(Student));
head->name[]='\0';
head->point = ;
head->stu = newLinkTable; return head;
}
int main(void){
char sf[];
/**
* 创建单向链表
*/
int num;
printf ("请输入学生人数\n");
scanf("%d",&num);
Student *link_stu = CreateLink_Table(num);
/**
* 单向链表插入节点
*/
printf ("请插入节点内容 在 已存在节点名字的后面,如 已存在节点名字|待插入名字|待插入分数 \n");
scanf("%s",sf);
link_stu = insertStudentLinkTable(link_stu,sf);
/**
* 反转单向链表
*/
printf("反转链表Y|N \n");
scanf("%s",sf);
if (strcmp(sf,"Y")==) {
Student *newLt= ReversionStudentLinkTable(link_stu);
//查询
selectStudent(newLt);
}
return 0;
}
复习下C 链表操作(单向链表)的更多相关文章
- Python3玩转单链表——逆转单向链表pythonic版
[本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...
- 《Java数据结构》链表结构(单向链表,双向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- C++实现企业链表(单向链表的另外一种实现方式)
LinkList.h #include <windows.h> #include <stdio.h> // 链表小结点 typedef struct LINKNODE { LI ...
- C/C++中对链表操作的理解&&实例分析
链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称 ...
- python中的单向链表实现
引子 数据结构指的是是数据的组织的方式.从单个数据到一维结构(线性表),二维结构(树),三维结构(图),都是组织数据的不同方式. 为什么需要链表? 顺序表的构建需要预先知道数据大小来申请连续的存储空间 ...
- Alan Cox:单向链表中prev指针的妙用
之前发过一篇二级指针操作单向链表的例子,显示了C语言指针的灵活性,这次再探讨一个指针操作链表的例子,而且是一种完全不同的用法. 这个例子是linux-1.2.13网络协议栈里的,关于链表遍历& ...
- JAVA单向链表实现
JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...
- 复习下C 链表操作(单向循环链表、查找循环节点)
循环链表 稍复杂点. 肯能会有0 或 6 字型的单向循环链表. 接下来创建 单向循环链表 并 查找单向循环链表中的循环节点. 这里已6字型单向循环链表为例. //创建 循环链表 Student * ...
随机推荐
- webpack4 css 文件提取 压缩 MiniCssExtractPlugin optimize-css-assets-webpack-plugin
1.使用的插件 MiniCssExtractPlugin:https://webpack.js.org/plugins/mini-css-extract-plugin/#src/components/ ...
- oracle12c安装报错:PRVF-0002的解决方法
出错信息: 安装oracle12c, ./runInstaller 启动图形化报错 PRVF-0002 : Could not retrieve local nodename. 原因: 找不到主机名的 ...
- 主成分分析PCA
PCA(Principal Component Analysis)不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式. PCA把原先的n个特征用数目更少的m个特征取代,新特征 ...
- 20 道 Spring Boot 面试题
转自:微信公众号:Java技术栈(id: javastack) 面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段 ...
- 键盘录入, if语句
1.运算符 (1).算数运算符 A:+ - * / % ++ -- 注意:%运算符号取决于被摸数. ++ --的两种用法:1.单独使用 ,都 ...
- ML之监督学习算法之分类算法一 ——— 决策树算法
一.概述 决策树(decision tree)的一个重要任务是为了数据中所蕴含的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,在这些机器根据数据创建规则时,就是机器学习的过程. ...
- kubernetes架构之二
一.概述 IaaS:即基础设施即服务,通过虚拟化和分布式存储等技术,实现对包括服务器.存储设备.网络设备等各种物理资源的抽象:从而形成了一个可扩展.可按需分配的虚拟资源池.最具代表性的IaaS产品有A ...
- android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法
今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化.最后发现原因是 ListView滚 ...
- NPM Node.js 包管理
1.NPM 简介 1.1 NPM Node.js® 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可方便地构建快速,可扩展的网络应用程序的平台.Node.js 使用事件驱动, ...
- hashCode和identityHashCode 的关系
1:首先看一下JDk API的观点 1-1:hashCode方法相关 1-2:identityHashCode()方法相关 2:此例的核心程序,对应的观点在注释中已经有所说明,请自己也动手实验一下看看 ...