zoukankan      html  css  js  c++  java
  • C语言之----面向对象的方法实现链表的操作

      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("---------------------------------------
    ");
     72     (*(op->selects)) (&p);    //调用op类 遍历链表
     73     (*(op->updates)) (&p, "123", 100, 1);    //调用op类 更新一个节点
     74     printf("---------------------------------------
    ");
     75     (*(op->selects)) (&p);
     76     (*(op->deletes)) (&p, 2);    //调用op类 删除一个节点
     77     printf("---------------------------------------
    ");
     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("请输入正确的数据!
    ");
    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("请检查你的数据!
    ");
    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("请检查你的数据!
    ");
    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("请检查你的输入!
    ");
    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
    ", 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 }
  • 相关阅读:
    开源项目记录
    Linux的磁盘分区(一)
    Linux下的用户权限
    HeapSort 堆排序
    git参考手册
    SGU 分类
    20130704
    七月三日

    20130629
  • 原文地址:https://www.cnblogs.com/chengliangsheng/p/3781706.html
Copyright © 2011-2022 走看看