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 }