C语言之----面向对象的方法实现链表的操作
2014-06-11 12:37
501 查看
/* * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法 * 其他的程序调用op类,实现对表链表的操作 * 链表包括 * 面向对象,简单易学程序更加紧凑,更加健壮,更安全 */ #include<string.h> #include<stdlib.h> #include<stdio.h> #define ok 1 #define err 0 #define null NULL #define len sizeof(struct student) //结构体student 的长度 #define llen sizeof(struct Op) //结构体op 的长度 /* * c语言中的结构体,包括3个简单的数据类型, * 面向对象中的类,包括3个属性 */ struct student { char *name; int age; struct student *next; }; /* * 实现类op,op包含了所有的对链表操作的方法 * 对数据及方法的封装,有保护数据的功能 */ struct Op { int l; //记录链表的长度 int (*sinit) (struct student * *s); //初始化一个链表 int (*Free) (struct student * *s); //销毁一个链表 int (*selects) (struct student * *s); //遍历一个链表 int (*add1) (struct student * *s, struct student * *stu, int i); //增加一个节点 int (*add2) (struct student * *s, char *name, int age, int i); //初始化一个链表节点 struct student *(*getstudent) (char *name, int age); //更新一个链表节点 struct student *(*updateage) (struct student * *s, int age, int i); struct student *(*updatename) (struct student * *s, char *name, int i); struct student *(*updates) (struct student * *s, char *name, int age, int i); //删除一个链表节点 struct student *(*deletes) (struct student * *s, int i); }; struct Op *op; //声明一个op类 //声明链表的操作方法,即链表的增 删 改 查 销毁 初始化 struct student *deletes(struct student * *s, int i); struct student *updates(struct student * *s, char *name, int age,int i); struct student *updateage(struct student * *s, int age, int i); struct student *updatename(struct student * *s, char *name, int i); struct student *getstudent(char *name, int age); int add1(struct student * *s, struct student * *stu, int i); int add2(struct student * *s, char *name, int age, int i); int selects(struct student * *s); int sinit(struct student * *s); int Free(struct student * *s); int main() { struct student *p; init(&op); //初始化一个OP操作 (*(op->sinit)) (&p); //调用op类实现初始化一个链表的头节点 (*(op->add2)) (&p, "my", 22, 1); //调用op类实现添加为链表一个节点 (*(op->add2)) (&p, "you", 23, 1); (*(op->add2)) (&p, "she", 24, 1); //调用op类实现添加为链表一个节点 (*(op->add2)) (&p, "he", 25, 1); printf("---------------------------------------\n"); (*(op->selects)) (&p); //调用op类 遍历链表 (*(op->updates)) (&p, "123", 100, 1); //调用op类 更新一个节点 printf("---------------------------------------\n"); (*(op->selects)) (&p); (*(op->deletes)) (&p, 2); //调用op类 删除一个节点 printf("---------------------------------------\n"); (*(op->selects)) (&p); (*(op->Free)) (&p); //调用op类 销毁链表 return ok; } //一下内容可以包含在一个头文件中 /* * 初始化一个链表节点 并为链表节点赋值 * @return 返回一个链表节点 这个节点就是以name和age 为属性的student节点 * @param name age student 的两个属性 */ struct student *getstudent(char *name, int age) { struct student *p; (*(op->sinit)) (&p); //初始化一个链表的节点 p->name = name; p->age = age; return p; } /* * 初始化一个op类 * 并对op的方法进行封装 */ int init(struct Op * *op) { *op = (struct Op *) malloc(llen); //对链表的所有的操作进行封装 (*op)->l = 0; //对属性l封装 (*op)->sinit = sinit; (*op)->Free = Free; (*op)->selects = selects; (*op)->add1 = add1; (*op)->add2 = add2; (*op)->getstudent = getstudent; (*op)->updateage = updateage; (*op)->updatename = updatename; (*op)->updates = updates; (*op)->deletes = deletes; return ok; } /* * 删除一个链表节点 * 并返回删除前的链表节点 */ struct student *deletes(struct student * *s, int i) { struct student *p, *student; p = *s; if (i > op->l || i < 0) { printf("请输入正确的数据!\n"); return null; } int j = 0; for (; j < i - 1; j++) { p = p->next; } student = p->next; p->next = p->next->next; op->l--; return student; } /* * 更新链表的数据 * 返回更新前的链表 */ struct student *updates(struct student * *s, char *name, int age, int i) { struct student *p; (*(op->updateage)) (s, age, i); p = (*(op->updatename)) (s, name, i); return p; } /* * 更新链表的数据 * 返回更新前的链表 */ struct student *updateage(struct student * *s, int age, int i) { struct student *p, *student; p = *s; if (i <= 0 || i > op->l) { printf("请检查你的数据!\n"); return null; } int j = 0; for (; j != i; j++) { p = p->next; } student = p; p->age = age; return student; } /* * 更新链表的数据 * 返回更新前的链表 */ struct student *updatename(struct student * *s, char *name, int i) { struct student *p, *student; p = *s; if (i <= 0 || i > op->l) { printf("请检查你的数据!\n"); return null; } int j = 0; for (; j != i; j++) { p = p->next; } student = p; p->name = name; return student; } /* * 增加一个链表节点 */ int add2(struct student * *s, char *name, int age, int i) { struct student *p; p = (*(op->getstudent)) (name, age); (*(op->add1)) (s, &p, i); } /* * 增加一个链表节点 */ int add1(struct student * *s, struct student * *stu, int i) { struct student *p; p = *s; if (i > op->l + 1 || i < 0) { printf("请检查你的输入!\n"); return err; } op->l++; int j = 0; for (; j < i - 1; j++) { p = p->next; } (*stu)->next = p->next; p->next = *stu; return ok; } /* * 初始化一个链表 */ int sinit(struct student * *s) { (*s) = (struct student *) malloc(len); (*s)->name = "hello"; (*s)->age = 23; (*s)->next = null; return ok; } /* * 遍历一个链表 */ int selects(struct student * *s) { struct student *p; p = *s; while (p) { printf("%s %d\n", p->name, p->age); p = p->next; } return ok; } /* * 销毁链表 * 可以用void 代替 struct student 实现对所有的结构体销毁 */ int Free(struct student * *s) { free(*s); return ok; }
相关文章推荐
- C语言实现双向链表的基本操作
- 单链表操作大全C语言实现
- C语言:链表的循环,两种思考方法,第一种用select_1()实现,第二种用select_2()实现.
- c语言实现--双向循环链表操作
- c语言自定义方法实现字符串的7个操作
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 如何使用c语言实现双向链表的插入删除操作
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言实现链表的创建、增加、删除、查询、逆序、清空等基本操作
- 双向链表的操作实现(c语言)
- c语言实现--不带头结点的单链表操作
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- 链表的实现与操作(C语言实现)
- 单链表相关操作之C语言实现:插入,删除,倒转,复制,查找。。。
- c语言实现循环链表的增删插入等操作
- c语言实现单链表操作
- c语言实现--带头结点单链表操作
- C语言实现链表的相关操作
- 双向链表的实现与操作(C语言实现)