2010计本3班-杨蒙-面向对象的C--实现链表操作
ym@ubuntu:~/桌面$ gedit student.c
-
/*
-
* 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化
-
* 运用面向对象的思想,实现一个类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类
-
int main()
-
{
-
struct student *p;
-
init(&op); //初始化一个链表节点
-
(*(op->sinit)) (&p); //调用op类实现初始化一个链表的头节点
-
(*(op->add2)) (&p, "ym", 24, 1); //调用op类实现添加为链表一个节点
-
(*(op->add2)) (&p, "ym", 25, 1);
-
printf("---------------------------------------\n");
-
(*(op->selects)) (&p); //调用op类 遍历链表
-
(*(op->updates)) (&p, "ym123", 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)
-
{
-
//声明链表的操作方法,即链表的增 删 改 查 销毁 初始化
-
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);
-
*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 = "yangmeng";
-
(*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;
-
}
ym@ubuntu:~/桌面$ indent -kr -i8 student.c
ym@ubuntu:~/桌面$ gcc student.c
ym@ubuntu:~/桌面$ ./a.out
-
/*
-
* 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化
-
* 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法
-
* 其他的程序调用op类,实现对表链表的操作
-
* 链表包括
-
* 面向对象,简单易学程序更加紧凑,更加健壮,更安全
-
*/
-
---------------------------------------
-
yangmeng 23
-
ym 25
-
ym 24
-
---------------------------------------
-
yangmeng 23
-
ym123 100
-
ym 24
-
---------------------------------------
-
yangmeng 23
-
ym123 100
-
ym@ubuntu:~/桌面$
阅读(1027) | 评论(0) | 转发(0) |