全部博文(38)
分类: C/C++
2010-03-11 15:41:08
/* 功能: 创建链表 */ #include #include /* 创建一个 结构, 数据域仅有一个名字字段,指针域为结构指针 */ struct stu { char name[20]; struct stu *next; }; /* 创建链表的函数 create */ struct stu *create(int n) { struct stu *head ; /* 链表头地址指针, 即通过此访问链表 */ struct stu *pthis ; /* 链表当前地址指针, 当前访问的结构 */ struct stu *ptemp ; /* 临时交换地址指针, 保存当前地址, 当前指针移到下一节点时就是前一节点的地址 */ int i ; /* 自变循环变量 */ for (i = 0; i < n; i++) { pthis = (struct stu *)malloc(sizeof(struct stu)) ; printf("请输入姓名: ") ; scanf("%s",pthis->name) ; /* 当i==0时,表示当前第一个节点 */ if (i == 0) { head = pthis ; ptemp = pthis ; /* 第一个节点后,pthis指向了第二个节点,此时ptemp指向的地址仍然是第一个节点, 将pthis的地址赋于ptemp的指针域指针next, 以此类推 */ } else { ptemp->next = pthis ; } /* 由于数据输入仅赋值给数据域, 指针域也需要赋值, 此时可以暂时赋值NULL(最后一个节点的指针域也是指向NULL) */ pthis->next = NULL ; /* 将当前的地址指针pthis的值赋于临时交换地址指针ptemp, 然后将执行循环对pthis重新赋值 */ ptemp = pthis ; } /* 返回链表的头地址 */ return(head); } /* 创建打印链表函数lprint, 输入为链表的首地址 */ void lprint(struct stu *p) { if (p == NULL) { printf("\n空链表.\n"); } else { printf("姓名\n"); while(p) { /* p = p->next 是while的循环条件,当p 地址节点存在时,打印数据库 */ printf("%s\n", p->name); p = p->next ; } } } /* 主函数 调用create创建链表, 然后调用lprinf打印 */ main() { struct stu *p ; int num ; printf("请输入欲创建链表的节点数: "); scanf("%d",&num); p = create(num); lprint(p); } |