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语言之----面向对象的方法实现链表的操作的更多相关文章

  1. C语言提高 (6) 第六天 文件(续) 链表的操作

    1昨日回顾 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &l ...

  2. 基于C语言的面向对象编程

    嵌入式软件开发中,虽然很多的开发工具已经支持C++的开发,但是因为有时考虑运行效率和编程习惯,还是有很多人喜欢用C来开发嵌入式软件.Miro Samek说:"我在开发现场发现,很多嵌入式软件 ...

  3. 使C语言实现面向对象的三个要素,你掌握了吗?

  4. go语言面向对象之方法

    1.实现方法 package main import "fmt" //在面向对象编程中,一个对象其实就是一个简单的值或者一个变量,在这个 //对象中包含一些函数 //这种带有接受者 ...

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

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  6. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  7. JavaScript面向对象继承方法

    JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是JavaScript的类型非常松散,也没有编译器.这样一来 ...

  8. 第二十五节:Java语言基础-面向对象基础

    面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...

  9. 比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

    一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 –  比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...

随机推荐

  1. web自动化之浏览器启动

    一.环境准备 1.本地引入jar 从http://selenium-release.storage.googleapis.com/index.html?path=3.9/,下载selenium-ser ...

  2. 在 .NET 中创建对象的几种方式的对比

    在 .net 中,创建一个对象最简单的方法是直接使用 new (), 在实际的项目中,我们可能还会用到反射的方法来创建对象,如果你看过 Microsoft.Extensions.DependencyI ...

  3. centos7 源码安装指定版本的php7

    很多时候可能会遇到需要手动源码安装软件的时候,所以自己实践了一把,并且把安装过程中遇到的问题,以及在网上找到的解决办法(实测有效)都记录下来,方便日后学习实践. 1. 系统环境 # cat /etc/ ...

  4. Cannot read property 'data' of undefined —— 小程序开发

    由于疫情原因目前处于半下岗状态,在家的时候就研究起了小程序开发.由于是新手,所以总会遇到各种问题,顺便记录一下. wx.showModal({ title: '提示', content: '这是一个模 ...

  5. vue(24)网络请求模块axios使用

    什么是axios Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 主要的作用:axios主要是用于向后台发起请求的,还有在请求中做更多是可控功能. a ...

  6. IPV6改造?华为云如此简单

    现在很多企业都在搞这个IPV6改造,说实话这个IPV6改造我这边也不是特别精通,也是通过查阅各种资料来了解IPV6这个东西,下面是我查的一些资料大家可以借鉴一下. IPv6改造三步曲--Vecloud ...

  7. vulnhub-DC:3靶机渗透记录

    准备工作 在vulnhub官网下载DC:1靶机www.vulnhub.com/entry/dc-3,312/ 导入到vmware 导入的时候遇到一个问题 解决方法: 点 "虚拟机" ...

  8. 流暢的pyhton4---數據庫備份

    一.linux數據庫備份腳本 1.数据库备份,命令如下: ./pg_dump -h localhost -p 5432 -U postgres -W -F c -b -v -f "/opt/ ...

  9. golang可执行文件瘦身(缩小文件大小)

    起因 golang部署起来极其遍历,但有时候希望对可执行文件进行瘦身(缩小文件大小) 尝试 情况允许情况下,交叉编译为32位 删除不必要的符号表.调试信息 尝试用对应平台的upx打压缩壳 解决 经过多 ...

  10. js问题记录

    1.aixos请求响应302重定向时无法获取返回数据, 解决方法:在请求头中添加  headers: { 'X-Requested-With': 'XMLHttpRequest' },