本帖最后由 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
|