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;
}
//使用链表而不是结构数组存放电影信息
#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;
}
相关文章推荐
- (转)c语言_链表实例讲解(两个经典例子)
- c语言_链表实例讲解(两个经典例子)
- 设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并成一个案元素递减有序的单链表C(该程序中的功能包含了上几个博客中的部分功能)
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 数据结构_两个有序链表归并成新的链表(基于头插法建表与尾插法建表)
- 【题目37】合并两个有序链表
- 两个链表的第一个公共结点
- 将两个非递减的有序链表合并为一个非递增的有序链表
- 链表实现两个多项式的加法
- 【追求进步】两个链表的第一个公共结点
- 委托小例子两个
- 逆转交替合并两个链表
- 两个有序链表连接(归并排序中用到的)
- PTA:两个有序链表的合并解题报告
- 剑指offer——两个链表的第一个公共结点(给出的方法,都是针对有且只有一个公共节点的方法)
- 两个链表的第一个公共节点
- 剑指offer-面试题37:两个链表中的一个公共结点
- 关于linux内核链表分析的例子
- 如何判断两个链表相交及找到第一个相交点
- 建立单链表并交换表中任意两个元素