复习下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 * ...
随机推荐
- Python学习笔记二:函数式编程
1:Python中,内置函数名相当于一个变量,指向内置函数.所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了. 2:高级函 ...
- ubuntu下查询SSH状态和安装SSH服务
1.查询SSH的安装状态 rpm -qa |grep ssh 上面的命令可能出现提示说rpm未安装,可以使用下面这命令进行安装 sudo apt-get install rpm 某些帖子上也可以使用y ...
- Lotus Domino和关系型数据库(LEI,DESC,JDBC连接)
Domino和关系数据库进行交互是日常项目开发中经常涉及到的一个方面,每个domino开发人员都写过这样的程序,本文就这个方面做一下简单的总结. 一.工具篇 1.使用LEI(Lotus Enterpr ...
- XC文件管理器-打造优美易用的文件管理器
技术:Android+java 概述 XC文件管理器,是基于Android6.0+开发的一个方便易用的文件管理器,具有文件的目录管理和文件的管理,主要包括文件的新建.删除.重命名.复制,移动剪切以 ...
- 【TP3.2.X】(同样适用于OT) 设置单入口index.php文件,区分PC/WAP/Wechat 三个终端
1.目的:本教程适用于 OneThink1.0.或者TP3.2.X 系列,达到单入口index.php文件,区分PC/WAP/Wechat 三个终端 2.启发至 : http://www.thinkp ...
- 邮件相关协议及JavaMail 包简介
1. 邮件服务器 按功能划分,邮件服务器可以划分为两种类型: SMTP邮件服务器:用于替用户发送邮件和接收外面发送给本地用户的邮件,相当于现实生活中邮局的邮件接收部门(可接收普通用户要投出的邮件和其他 ...
- iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch
本文为转载文章 故事背景: 这两天,不少iOS开发群都炸窝了,原因是部分iOS开发者收到了苹果的警告邮件: 有开发者质疑可能是项目中使用了JSPatch.weex以及ReactNative等热更新技术 ...
- Xshell连接Ubuntu失败问题
转自:https://www.linuxidc.com/Linux/2017-08/146222.htm Xshell是一个安全终端模拟软件,可以进行远程登录.我使用XShell的主要目的是在Wind ...
- linux shell 脚本攻略学习2
1.关于文件描述符和重定向: 文件描述符是与一个打开的文件或数据流相关联的整数.文件描述符0.1以及2是系统预留的. 0——stdin(标准输入) 1——stdout(标准输出) 2——stderr( ...
- 【DeepLearning】Exercise:Learning color features with Sparse Autoencoders
Exercise:Learning color features with Sparse Autoencoders 习题链接:Exercise:Learning color features with ...