您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: