复习下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 * ...
随机推荐
- 〖Linux〗ADT_Bundle配置
1. 配置自动补全: Windows -> preferences -> 搜索assist,修改 java xml自动触发补全:.abcdefghijklmnopqrstuvwxyzABC ...
- 转 Linux定时执行任务命令at和crontab
本文介绍在Linux下的两种定时执行任务的方法:at命令,以及crontab服务. (1)at命令 假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了. 设置at命令很简单,指示定 ...
- OpenCV windows 上安装
1.先按照 Anaconda , 有关教程,可以去其他博客查看 2.傻瓜的装Opencv.(我采用的) 在Anaconda Prompt中输入: conda install -c https:// ...
- Linux手工添加swap
swap是一把双刃剑,在实践中发现,严重的会导致linux负载超高,失去响应kswap内存的信息转存到swap(硬盘)!,在内存较大的情况下不建议建立swap!!! 师夷长技以制夷! 1.root权限 ...
- ios中MKHorizMenu用法
下载地址 https://github.com/MugunthKumar/MKHorizMenuDemo直接 加入MKHorizMenu目录即可 下载包地址 http://pan.baidu.com/ ...
- ios中webview的高级用法(二)
框架: webview与js的通信框架 #import "MJViewController.h" #import "MBProgressHUD+Add.h" ...
- Mac巧用AirDrop实现大文件传输
最近想更新一下Xcode8.3,无奈资源太大,不想一点点下载了,公司服务器上正好有官网下载好的,就想直接拿过来使用,本来想通过QQ传输的,无奈发现QQ传输提示资源过大. 于是就想到了这货:AirDro ...
- 使用Thrift让Python为Java提供服务
Thrift是基于TCP的,谷歌的GRPC是基于HTTP的.Thrift和GRPC都是比直接写个web接口进行调用更完美的方式,最明显的一点就是:我们可以定义结构体,避免了手动解析的过程. 但是,在将 ...
- HttpClient库设置超时
HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpCli ...
- 【RS】Local Latent Space Models for Top- N Recommendation-利用局部隐含空间模型进行Top-N推荐
[论文标题]Local Latent Space Models for Top- N Recommendation (KDD-2018 ) [论文作者]—Evangelia Christakopou ...