C语言之----面向对象的方法实现链表的操作


  1 /*
2 * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化
3 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法
4 * 其他的程序调用op类,实现对表链表的操作
5 * 链表包括
6 * 面向对象,简单易学程序更加紧凑,更加健壮,更安全
7 */
8 #include<string.h>
9 #include<stdlib.h>
10 #include<stdio.h>
11
12 #define ok 1
13 #define err 0
14 #define null NULL
15 #define len sizeof(struct student) //结构体student 的长度
16 #define llen sizeof(struct Op) //结构体op 的长度
17 /*
18 * c语言中的结构体,包括3个简单的数据类型,
19 * 面向对象中的类,包括3个属性
20 */
21 struct student {
22 char *name;
23 int age;
24 struct student *next;
25 };
26 /*
27 * 实现类op,op包含了所有的对链表操作的方法
28 * 对数据及方法的封装,有保护数据的功能
29 */
30 struct Op {
31 int l; //记录链表的长度
32 int (*sinit) (struct student * *s); //初始化一个链表
33 int (*Free) (struct student * *s); //销毁一个链表
34 int (*selects) (struct student * *s); //遍历一个链表
35 int (*add1) (struct student * *s, struct student * *stu, int i); //增加一个节点
36 int (*add2) (struct student * *s, char *name, int age, int i);
37 //初始化一个链表节点
38 struct student *(*getstudent) (char *name, int age);
39 //更新一个链表节点
40 struct student *(*updateage) (struct student * *s, int age, int i);
41 struct student *(*updatename) (struct student * *s, char *name,
42 int i);
43 struct student *(*updates) (struct student * *s, char *name,
44 int age, int i);
45 //删除一个链表节点
46 struct student *(*deletes) (struct student * *s, int i);
47 };
48 struct Op *op; //声明一个op类
49 //声明链表的操作方法,即链表的增 删 改 查 销毁 初始化
50 struct student *deletes(struct student * *s, int i);
51 struct student *updates(struct student * *s, char *name, int age,int i);
52 struct student *updateage(struct student * *s, int age, int i);
53 struct student *updatename(struct student * *s, char *name, int i);
54 struct student *getstudent(char *name, int age);
55 int add1(struct student * *s, struct student * *stu, int i);
56 int add2(struct student * *s, char *name, int age, int i);
57 int selects(struct student * *s);
58 int sinit(struct student * *s);
59 int Free(struct student * *s);
60
61
62 int main()
63 {
64 struct student *p;
65 init(&op); //初始化一个OP操作
66 (*(op->sinit)) (&p); //调用op类实现初始化一个链表的头节点
67 (*(op->add2)) (&p, "my", 22, 1); //调用op类实现添加为链表一个节点
68 (*(op->add2)) (&p, "you", 23, 1);
69 (*(op->add2)) (&p, "she", 24, 1); //调用op类实现添加为链表一个节点
70 (*(op->add2)) (&p, "he", 25, 1);
71 printf("---------------------------------------\n");
72 (*(op->selects)) (&p); //调用op类 遍历链表
73 (*(op->updates)) (&p, "123", 100, 1); //调用op类 更新一个节点
74 printf("---------------------------------------\n");
75 (*(op->selects)) (&p);
76 (*(op->deletes)) (&p, 2); //调用op类 删除一个节点
77 printf("---------------------------------------\n");
78 (*(op->selects)) (&p);
79 (*(op->Free)) (&p); //调用op类 销毁链表
80 return ok;
81 }
82
83 //一下内容可以包含在一个头文件中
84 /*
85 * 初始化一个链表节点 并为链表节点赋值
86 * @return 返回一个链表节点 这个节点就是以name和age 为属性的student节点
87 * @param name age student 的两个属性
88 */
89 struct student *getstudent(char *name, int age)
90 {
91 struct student *p;
92 (*(op->sinit)) (&p); //初始化一个链表的节点
93 p->name = name;
94 p->age = age;
95 return p;
96 }
97
98 /*
99 * 初始化一个op类
100 * 并对op的方法进行封装
101 */
102 int init(struct Op * *op)
103 {
104 *op = (struct Op *) malloc(llen);
105 //对链表的所有的操作进行封装
106 (*op)->l = 0; //对属性l封装
107 (*op)->sinit = sinit;
108 (*op)->Free = Free;
109 (*op)->selects = selects;
110 (*op)->add1 = add1;
111 (*op)->add2 = add2;
112 (*op)->getstudent = getstudent;
113 (*op)->updateage = updateage;
114 (*op)->updatename = updatename;
115 (*op)->updates = updates;
116 (*op)->deletes = deletes;
117 return ok;
118 }
119
120 /*
121 * 删除一个链表节点
122 * 并返回删除前的链表节点
123 */
124 struct student *deletes(struct student * *s, int i)
125 {
126 struct student *p, *student;
127 p = *s;
128 if (i > op->l || i < 0) {
129 printf("请输入正确的数据!\n");
130 return null;
131 }
132 int j = 0;
133 for (; j < i - 1; j++) {
134 p = p->next;
135 }
136 student = p->next;
137 p->next = p->next->next;
138 op->l--;
139 return student;
140 }
141
142 /*
143 * 更新链表的数据
144 * 返回更新前的链表
145 */
146 struct student *updates(struct student * *s, char *name, int age, int i)
147 {
148 struct student *p;
149 (*(op->updateage)) (s, age, i);
150 p = (*(op->updatename)) (s, name, i);
151 return p;
152 }
153
154 /*
155 * 更新链表的数据
156 * 返回更新前的链表
157 */
158 struct student *updateage(struct student * *s, int age, int i)
159 {
160 struct student *p, *student;
161 p = *s;
162 if (i <= 0 || i > op->l) {
163 printf("请检查你的数据!\n");
164 return null;
165 }
166 int j = 0;
167 for (; j != i; j++) {
168 p = p->next;
169 }
170 student = p;
171 p->age = age;
172 return student;
173 }
174
175 /*
176 * 更新链表的数据
177 * 返回更新前的链表
178 */
179 struct student *updatename(struct student * *s, char *name, int i)
180 {
181 struct student *p, *student;
182 p = *s;
183 if (i <= 0 || i > op->l) {
184 printf("请检查你的数据!\n");
185 return null;
186 }
187 int j = 0;
188 for (; j != i; j++) {
189 p = p->next;
190 }
191 student = p;
192 p->name = name;
193 return student;
194 }
195
196 /*
197 * 增加一个链表节点
198 */
199 int add2(struct student * *s, char *name, int age, int i)
200 {
201 struct student *p;
202 p = (*(op->getstudent)) (name, age);
203 (*(op->add1)) (s, &p, i);
204 }
205
206 /*
207 * 增加一个链表节点
208 */
209 int add1(struct student * *s, struct student * *stu, int i)
210 {
211 struct student *p;
212 p = *s;
213 if (i > op->l + 1 || i < 0) {
214 printf("请检查你的输入!\n");
215 return err;
216 }
217 op->l++;
218 int j = 0;
219 for (; j < i - 1; j++) {
220 p = p->next;
221 }
222 (*stu)->next = p->next;
223 p->next = *stu;
224 return ok;
225 }
226
227 /*
228 * 初始化一个链表
229 */
230 int sinit(struct student * *s)
231 {
232 (*s) = (struct student *) malloc(len);
233 (*s)->name = "hello";
234 (*s)->age = 23;
235 (*s)->next = null;
236 return ok;
237 }
238
239 /*
240 * 遍历一个链表
241 */
242 int selects(struct student * *s)
243 {
244 struct student *p;
245 p = *s;
246 while (p) {
247 printf("%s %d\n", p->name, p->age);
248 p = p->next;
249 }
250 return ok;
251 }
252 /*
253 * 销毁链表
254 * 可以用void 代替 struct student 实现对所有的结构体销毁
255 */
256 int Free(struct student * *s)
257 {
258 free(*s);
259 return ok;
260 }

C语言之----面向对象的方法实现链表的操作,布布扣,bubuko.com

时间: 2024-08-07 20:51:36

C语言之----面向对象的方法实现链表的操作的相关文章

Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

Objective-C语言介绍 . Objc与C语言 . 面向对象编程 . 类和对象 . 属性和方法 . 属性和实例变量 1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成开发工具Xcode编写OC的HelloWorld程序,在Xcode的控制台中, 1.2 方案 首先,启动集成开发工具Xcode. 然后,创建OC语言的工程. 最后,运行所创建的工

结构化开发方法和面向对象开发方法的比较

1. 两者基本思想的比较 1.1结构化方法的基本思想 结构化方法是一种传统的软件开发方法,它是由结构化分析.结构化设计和结构化程序设计三部分有机组合而成的.结构化设计方法是以自顶向下,逐步求精,模块化为基点,以模块化,抽象,逐层分解求精,信息隐蔽化局部化和保持模块独立为准则的设计软件的数据架构和模块架构的方法学.它的要点是是把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内. 结构化方法的基本思想主要体现在三个方面. (

C语言实现贪吃蛇之结构链表篇

之前的两篇博客将运用的C语言知识限定在了一般的数组上,但如果已经完整地了解过C语言的话,运用结构和链表会让程序的结构更明了,逻辑更清晰.这篇博客就将介绍如何用结构和链表改善之前的程序. 首先,我们为蛇的节点定义一个结构: typedef struct node{ COORD cor; struct node *next; }node; COORD结构我在上一篇已经介绍过,这里就直接借用了. COORD food = { 3,5 }; node *head; food也相应地由COORD来定义,并

结构化系统开发和面向对象开发方法

结构化系统开发方法: 系统分析员.软件工程师.程序员以及最终用户按照用户至上的原则,自顶向下分析与设计和自底向上逐步实施的建立计算机信息系统的一个过程,是组织.管理和控制信息系统开发过程的一种基本框架. 三部分:管理策略部分:强调系统开发的规划.进程安排.评估.监控和反馈.开发策略部分:任务分解结构:WBS优先级结构.开发经验.开发标准. 开发过程分为:系统规划阶段.系统分析阶段.系统设计阶段.系统实施阶段.系统运行与维护阶段结构化开发早期的程序开发,如C语言,都是用结构化开发方法. 面向对象开

面向过程分析方法与面向对象分析方法的区别

一.结构化分析(面向过程)方法 结构化分析方法(Structured Method,结构化方法)是面向过程的程序设计的方法,是强调开发方法的结构合理性以及所开发软件的结构合理性的软件开发方法.结构是指系统内各个组成要素之间的相互联系.相互作用的框架.结构化开发方法提出了一组提高软件结构合理性的准则,如分解与抽象.模块独立性.信息隐蔽等.针对软件生存周期各个不同的阶段,它有结构化分析(SA).结构化设计(SD)和结构化程序设计(SP)等方法. 结构化分析方法给出一组帮助系统分析人员产生功能规约的原

公司服务器坏了,无聊按面向对象的方法分析下javascript的空值和假值

首先要知道javascript的自动转换,就是该处需要什么类型,那么javascript会自动把目前类型传入该需要类型的构造函数,来生成需要类型猜想1:undefined在javascript里是一个类估计(不继承object),null是object对象的一个子类,用面向对象的方法看待的话是这样只有0和空字符串等于false:undefined和null对象并不等于false对象,而null和undefined是相等的 这个怎么理解呢?       猜想2: 在你使用undefined对象和其

用C语言实现面向对象的开发

C语言的对象化模型 面向对象的特征主要包括: .封装,隐藏内部实现 .继承,复用现有代码 .多态,改写对象行为 采用C语言实现的关键是如何运用C语言本身的特性来实现上述面向对象的特征. 1.1 封装 封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性.封装使数据和加工该数据的 方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象 能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能 力的算法)对用户是隐蔽的.封装的目的在

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

最近看了一下java 8的一些新特性,其中最重要的莫过于Lambda表达式了,通过一阵子的学习,原本准备自己写一篇博客的,后来阅读了一位学长翻译过来的博客(原文是Brain Goetz的State of Lambda,下面会给出原文链接),觉得写的十分完美,把我想要写的和我没想到的都罗列了出来,就把这个分享给大家了. 注:原译文见  http://lucida.me/blog/java-8-lambdas-insideout-language-features/ 英语原版见:http://cr.

结构化开发方法v.s.面向对象开发方法

关于结构化和面向对象的程序设计方法的概念对比的讨论已经不是一个很新颖的话题,然而对于刚开始接触了解软件工程开发的新手,了解学习其不同的开发特点,参与其利弊的讨论,对于新的更好的编程范式的产生具有积极意义.而在在本文中,我们从该面向对象的程序和结构化程序的特征讨论区分. 结构化编程 Structured programming can be viewed as the pulling together, or synthesization of such ideas as program modu