|

楼主 |
发表于 2017-1-11 14:35:53
|
显示全部楼层
本帖最后由 lzgw 于 2017-1-11 19:57 编辑
我也把代码发上来,探讨一下哪个更省事,偷懒没建.h 和.c文件,都放一起了
- /*商店信息系统
- 以商店为单位按价格
- 由低到高显示所需物品*/
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct b1 //定义内层结构体
- {
- char name[10]; //物品名称
- int b; //物品价格
- struct b1 * next; //内层节点指针
- }b; //自定义类型名为b
- typedef struct a1 //定义外层结构体
- {
- char a[10]; //商铺名称
- struct b1 * head; //内层结构体头指针
- struct a1 * next; //外层节点指针
- }a; //自定义类型名为a;
- typedef a * A; //自定义a类型指针为A
- A input_c(); //输入外层链表数据
- b * input_i(); //输入内层链表数据
- A paixu(A pai, int num); //对外层链表排序
- void print(A head); //打印链表数据(内外层)
- void print_pai(A head); //打印排序后链表数据(内外层)
- void main() //主函数
- {
- int num = 0; //外层链表节点计数器
- A head; //外层链表头指针
- head = input_c(&num); //输入函数
- printf("\n");
- printf("排序前\n");
- print(head); //显示函数
- head = paixu(head, num); //排序函数
- printf("\n");
- printf("排序后\n");
- print_pai(head); //显示函数
- }
- 输入函数略;
- void print(A p_head) //显示函数
- {
- A head = p_head; //设定一个外层链表指针代替头指针,防止指针后移影响其他函数操作
- b * p; //设定一个内层链表指针代替头指针,防止指针后移影响其他函数操作
- while(head)
- {
-
- printf("%s店铺 ", head->a); //打印第一个店铺名称
- p = head->head; //内层链表指针赋值
- while(p)
- {
- printf("%s=", p->name); //打印内层物品名称
- printf("%d。", p->b); //打印内层物品价格
- p = p->next; //内层链表指针指向下一个节点
- }
- printf("\n");
- head = head->next; //外层链表指针指向下一个节点
- }
- printf("\n");
- }
- void print_pai(A p_head) //显示函数
- {
- char temp[10] = "app"; //此处假定查找的物品名,可以用交互式输入代替
- A head = p_head; //设定一个外层链表指针代替头指针,防止指针后移影响其他函数操作
- b * p; //设定一个内层链表指针代替头指针,防止指针后移影响其他函数操作
- while(head)
- {
- p = head->head; //内层链表指针赋值
- while(p && (strcmp(p->name, temp) != 0))//查找是否有要显示的物品
- p = p->next;
- if(p && (strcmp(p->name, temp) == 0)) //若有则执行
- {
- printf("%s店铺 ", head->a); //打印第一个店铺名称
- p = head->head; //内层链表指针赋值
- while(p)
- {
- if(strcmp(p->name, temp) == 0)
- {
- printf("%s=", p->name); //打印内层物品名称
- printf("%d。", p->b); //打印内层物品价格
- }
- p = p->next; //内层链表指针指向下一个节点
- }
- printf("\n");
- }
- head = head->next; //外层链表指针指向下一个节点
- }
- printf("\n");
- }
- #if(0)
- A paixu(A pai, int num) //排序函数(未完善)
- {
- A p1,p2,p3; //设定三个外层指针
- char temp[10] = "app"; //此处假定查找的物品名,可以用交互式输入代替
- while(num)
- {
- p3 = p1 = pai; //p1指向头结点,第一个店铺
- p2 = p1->next; //p2指向p1后的节点,第二个店铺
- while(p2)
- {
- while(p1->head && (strcmp(p1->head->name, temp) != 0))
- p1->head = p1->head->next;
- //若没有该物品,则p1->head变成空指针
- while(p2->head && (strcmp(p2->head->name, temp) != 0))
- p2->head = p2->head->next;
- //若没有该物品,则p2->head变成空指针
-
- if((p1->head != NULL) && (p2->head != NULL) && (p1->head->b > p2->head->b))
- // 若p1店内有该物品并且p1店铺内的物品价格大于p2店铺的物品价格
- {
- p1->next = p2->next; //p1尾指针指向p2尾指针
- p2->next = p1; //p2尾指针指向p1
- //此处完成p1和p2的位置交换
- if(p1 == pai)// p1为第一节点的时候
- {
- pai = p3 = p2; //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
- }
- else //p1不是第一个节点的时候
- {
- p3->next = p2; //p3尾指针指向p2
- p3 = p2; //p3指向p2,即p3永远指向p1的上一个节点
- }
- p2 = p1->next; //p2指针指向p1的后一个节点
- }
- else if((p1->head == NULL) || (p2->head != NULL) && (p1->head->b <= p2->head->b))
- // 若p1店铺内没有该物品,或物品价格小于等于p2店铺的物品价格
- {
- p3 = p1; //p3指向p1; p1,p2都后移一个节点
- p2 = p2->next;
- p1 = p1->next;
- }
- }
- num--;
- }
- return pai; //返回外层链表头指针
- }
- #else
- A paixu(A pai, int num) //排序函数(已完善)
- {
- A p1,p2,p3; //设定三个外层指针
- b * q1, *q2; //定义2个内层指针
- char temp[10] = "app";
- while(num)
- {
- p3 = p1 = pai; //p1指向头结点,第一个店铺
- p2 = p1->next; //p2指向p1后的节点,第二个店铺
-
- while(p2)
- {
- q1 = p1->head;
- q2 = p2->head;
- while(q1 && (strcmp(q1->name, temp) != 0))
- q1 = q1->next;
- //若没有该物品,则p1->head变成空指针
- while(q2 && (strcmp(q2->name, temp) != 0))
- q2 = q2->next;
- //若没有该物品,则p2->head变成空指针
-
- if(q1 == NULL) // 若p1店内有该物品并且p1店铺内的物品价格大于p2店铺的物品价格
- {
- p3 = p1; //p3指向p1; p1,p2都后移一个节点
- p2 = p2->next;
- p1 = p1->next;
- }
- else if((q1 != NULL) && (q2 == NULL))
- {
- p1->next = p2->next; //p1尾指针指向p2尾指针
- p2->next = p1; //p2尾指针指向p1
- //此处完成p1和p2的位置交换
- if(p1 == pai)// p1为第一节点的时候
- {
- pai = p3 = p2; //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
- }
- else //p1不是第一个节点的时候
- {
- p3->next = p2; //p3尾指针指向p2
- p3 = p2; //p3指向p2,即p3永远指向p1的上一个节点
- }
- p2 = p1->next; //p2指针指向p1的后一个节点
- }
- else if((q1 != NULL) && (q2 != NULL))
- {
- if(q1->b > q2->b)
- {
- p1->next = p2->next; //p1尾指针指向p2尾指针
- p2->next = p1; //p2尾指针指向p1
- //此处完成p1和p2的位置交换
- if(p1 == pai)// p1为第一节点的时候
- {
- pai = p3 = p2; //头指针\p3都指向交换后的p2,(p2和p1已经交换位置)
- }
- else //p1不是第一个节点的时候
- {
- p3->next = p2; //p3尾指针指向p2
- p3 = p2; //p3指向p2,即p3永远指向p1的上一个节点
- }
- p2 = p1->next; //p2指针指向p1的后一个节点
- }
- else //(p1->head->b <= p2->head->b) 若p1店铺内没有该物品,或物品价格小于等于p2店铺的物品价格
- {
- p3 = p1; //p3指向p1; p1,p2都后移一个节点
- p2 = p2->next;
- p1 = p1->next;
- }
- }
- }
- num--;
- }
- return pai; //返回外层链表头指针
- }
- #endif
复制代码 |
|