您的位置:首页 > 其它

7.Cprimerplus链表的两个例子

2018-03-16 22:20 211 查看
1》
//使用链表而不是结构数组存放电影信息
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TSIZE 45
struct film {
char title[TSIZE];
int rating;
struct film *next;//指向链表的下一个结构
};
int main(void)
{
struct film *head = NULL;
struct film *a, *b;//上面这三个申明的仅是指向film结构体类型的指针,并不是结构体,所以此时系统并不为它们开辟film结构体大小
    //的空间,而仅是为它们开辟用于保存指向地址大小的空间,我这么说不知道你懂了没有?
char input[TSIZE];

puts("请输入要存入的电影名:");
while ((gets_s(input) != NULL && input[0] != '\0')) {//用户用键盘进行了输入,并且输入的是模拟的EOF或者空行,则跳出循环
b = (struct film *) malloc(sizeof(struct film));//分配一块结film构体大小的空间
if (head == NULL)//如果head为空指针,则把这第一个结构体的地址指针赋给head
head = b;
else
a->next = b;//否则如果这不是第一个结构体,就把其地址指针赋给上一个结构体的next成员,因为后面有语句使得a指向了上一
//个结构体
b->next = NULL;//把当前创建的结构体中的地址指向设为空
strcpy_s(b->title, input);//把当前输入的电影名存入当前创建的结构体相关成员中
puts("请输入它的评分(十分制):");
scanf_s("%d", &b->rating);
while (getchar() != '\n')//输入一个换行符使程序继续往下运行
continue;
puts("请输入下一步影片的名称(模拟输入EOF或空行结束):");
a = b;//语句执行到这里,把b指向的当前的结构体当做上一个结构体,并让a指向它,便于下一个影片的相关信息输入
}
//语句执行到这里,a和b存储的都是最后一个结构体的地址
if (head == NULL)
puts("不好意思,你还没有存入过电影,再见!");
else
{
b = head;
while (b != NULL)
{
printf("%s %d\n", b->title, b->rating);
b = b->next;
}
}
//任务完成,释放内存
b = head;
while (b != NULL)
{
free(b);
b = b->next;
}
puts("哦了!");
system("pause");
return 0;
}
2》
//使用链表而不是结构数组存放电影信息
//修改,使得程序既能顺序又能逆序显示电影信息
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TSIZE 45
struct film {
char title[TSIZE];
int rating;
struct film *next;//指向链表的下一个结构
struct film *last;//指向链表的上一个结构
};
int main(void)
{
struct film *head = NULL;
struct film *a, *b;//上面这三个申明的仅是指向film结构体类型的指针,并不是结构体,所以此时系统并不为它们开辟film结构体大小
    //的空间,而仅是为它们开辟用于保存指向地址大小的空间,我这么说不知道你懂了没有?
char input[TSIZE];

puts("请输入要存入的电影名:");
while ((gets_s(input) != NULL && input[0] != '\0')) {//用户用键盘进行了输入,并且输入的是模拟的EOF或者空行,则跳出循环
b = (struct film *) malloc(sizeof(struct film));//分配一块结film构体大小的空间
if (head == NULL)//如果head为空指针,则把这第一个结构体的地址指针赋给head
{
head = b;
b->last = NULL;//并把第一个结构体的成员last设为空
}
else
{
a->next = b;//否则如果这不是第一个结构体,就把其地址指针赋给上一个结构体的next成员,因为后面有语句使得a指向了上一
b->last = a;//并把上让当前创建的结构体的last成员指向上一个结构体
}
//个结构体
b->next = NULL;//把当前创建的结构体中的地址指向设为空
strcpy_s(b->title, input);//把当前输入的电影名存入当前创建的结构体相关成员中
puts("请输入它的评分(十分制):");
scanf_s("%d", &b->rating);
while (getchar() != '\n')//输入一个换行符使程序继续往下运行
continue;
puts("请输入下一步影片的名称(模拟输入EOF或空行结束):");
a = b;//语句执行到这里,把b指向的当前的结构体当做上一个结构体,并让a指向它,便于下一个影片的相关信息输入
}
//语句执行到这里,a和b存储的都是最后一个结构体的地址
if (head == NULL)
puts("不好意思,你还没有存入过电影,再见!");
else
{
b = head;
while (b != NULL)
{
printf("%s %d\n", b->title, b->rating);
b = b->next;
}

while (a != NULL)
{
printf("\n%s %d", a->title, a->rating);
a = a->last;
}
}
//任务完成,释放内存
b = head;
while (b != NULL)
{
free(b);
b = b->next;
}
puts("哦了!");
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: