复习下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-ldap fatal error: lber.h: No such file or directory
sudo apt-get install libsasl2-dev python-dev libldap2-dev libssl-dev sudo apt-get install -y python- ...
- java与C#、.NET AES加密、解密 解决方案
1.情景展示 Java提供的密钥,C#无法解密. 2.原因分析 在Java中,AES的实际密钥需要用到KeyGenerator 和 SecureRandom,但是C#和.NET 里面没有这2个类, ...
- Qt Installer Framework 使用说明(一)
目录 Qt Installer Framework 使用说明 1.Qt Installer Framework概述 选择安装包类型 促进更新 提供安装内容 2.入门指南 支持的平台 从源代码构建 支持 ...
- 读书笔记--<精益和敏捷开发大型项目应用指南>
[摘要] 3月份的时候,根据教练和其他多为项目经理的推荐,开始阅读这本书:本书共三大部分.12个章节,第一部分:思考工具,第二部分:组织工具:第三部分:杂记:全书相当于对精益思想和敏捷团队组织.Scr ...
- TL 重构
import dependencies.*;import org.apache.commons.lang3.ArrayUtils;import org.apache.commons.lang3.Str ...
- 一个成功的 Git 分支模型
在这篇文章中介绍的开发模型在大约一年前已经在我的私有项目和工作引入的,而且已经被证明是非常成功的.我想写一些关于这个模型的东西已经好一段时间了,但是一直苦于没有时间,不过现在可以了.我不想探讨任何项目 ...
- 【原创+亲测可用】JS如何区分微信浏览器、QQ浏览器和QQ内置浏览器
1.原理: 通过不同移动端的ua弹窗 获取user-agent 参数包含的信息,进行判断浏览器类型 在Android上 QQ内置环境的ua中有关键字 MQQBrowser, 并且后面包含一个[空白符+ ...
- ios中自定义button
自定义button #import <UIKit/UIKit.h> #define KFont 15 @interface DIYButton : UIButton @property(n ...
- Ubuntu中root用户和user用户的相互切换[转载自93度的饼干]
Ubuntu中root用户和user用户的相互切换 Ubuntu是最近很流行的一款Linux系统,因为Ubuntu默认是不启动root用户,现在介绍如何进入root的方法. (1)从user用户切换到 ...
- SoapUI利用Groovy把外部数据加载到request中
默认已经用Groovy把外部数据给读取出来了,关键是读取出来后,如何加载到request中去?这里提供了两种方法:1.该Groovy脚本的名称是"setUp" def num = ...