结构体和链表
结构体
一、PTA实验作业
题目1:通讯录排序
1.本题PTA提交列表
2. 设计思路
定义结构体数组保存不同人的姓名、生日、电话号码,输入相关信息,
用冒泡排序法将n个人按照生日的先后顺序排序,最后输出。
流程图:
3.本题调试过程碰到问题及PTA提交列表情况说明。
最长n答案错误是因为数组长度不够,应该再多一位。
题目2:通讯录的录入与显示
1. 本题PTA提交列表
2. 设计思路
定义结构体数组保存n条记录包含姓名、出生日期、性别、固定电话号码、移动电话号码。
输入n条记录,输入k和k个整数,表示要查询的记录编号,若找到该记录编号,则按格式输出,
否则输出Not Found
流程图:
3.本题调试过程碰到问题及PTA提交列表情况说明。
最长字符串和最小n,最大n都出错,刚开始以为是字符串的长度不够,
但长度增加之后依然出错,而且最小n也错了,说明不是这个问题。
又看了好几遍题目和代码,发现如果输入的k个数存在负数,数组下标从0开始
就找不到那条记录,所以if条件应改为(a[i]<n&&a[i]>=0)。
题目3:时间换算
1. 本题PTA提交列表
2. 设计思路
定义结构体数组储存时,分,秒,输入时分秒,和要加上的秒数n,
把n加上秒数,循环令j=秒数,如果j>=60,j=j-60,
把剩下的秒数赋值给数组中的秒数,分数和时数同样也是如此,最后输出。
流程图:
3.本题调试过程碰到问题及PTA提交列表情况说明
本题没有出现什么错误。
链表
题目1:单向链表4
1. 本题PTA提交列表
2. 设计思路
定义结构struct node{
int n;
struct node*next;
};
定义结构变量head,p;
输入变量a,a!=-1时,进入循环,新建链表
p->n=a; p->next=head;head=p;
最后循环遍历输出
流程图:
3.本题调试过程碰到问题及PTA提交列表情况说明
刚开始没有用链表解题时格式输出错误,行末无空格
题目2:单向链表5
1. 本题PTA提交列表
2. 设计思路
定义结构体变量p,tail,head;并初始化为NULL;输入num,
num!=0时进入循环,建立链表,关键步骤为:if(head==NULL),head=p;
else tail->next=p; tail=p;建完退出循环,输入n,
遍历链表,将链表中成绩大于等于n的结构体输出。
流程图:
3.本题调试过程碰到问题及PTA提交列表情况说明
本题没有出现错误
题目3:单向链表1
1. 本题PTA提交列表
2.设计思路
定义链表节点head,p,p2,tail;建立带有头节点的单项链表,
遍历链表,定义一个变量s用来计算链表中的奇数值节点的个数,
循环s次删除链表中的奇数值节点,遍历输出。
流程图:
编译错误:修改的时候忘了加反向大括号。
格式错误;
格式错误是输出的格式不满足题目要求,题目要求输出最后没有空格,
且每一行之后都要换行,我原本的思路是不删除奇数值节点,只把满足条件
的偶数值节点输出,但是这样就无法控制格式,只好删除奇数值节点,
形成新的链表,循环遍历链表再加个条件控制就好了。
二、同学代码结对互评
我的代码:
同学代码截图:
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?
我的代码把输入的n赋值给秒数,再用三个循环,分别改变秒,分,时的数据,
彦婵同学的代码把n用来循环,循环之后再加if条件,改变秒分时的数据,
我更喜欢我的代码风格,代码简洁明了。
三、截图本周题目集的PTA最后排名
四、本周学习总结
1.你学会了什么?
1.1 结构体的定义
struct 结构体名 struct student{
char name[20];
} stu;
也可这样定义:声明结构体后,大括号后不加变量,再定义struct student stu1, stu2 ;
结构体数组的定义: struct student x[10];
1.2 结构体成员的访问
两种方式: 直接访问。如:stu1.name
用指针访问。先定义指向结构体的指针:struct student *p;
然后可以通过: p->成员变量 来访问。
1.3链表结构体声明
struct node{
int n;
struct node *next;};
1.4链表的增删该查
链表是一种常见的动态进行存储分配的数据结构.用链表操作增加或删除数据效率更高。
链表形式:带头结点的单向链表、无头结点的单向链表
建立链表:头插法,尾插法
增加节点:第i个结点后面插入一个新节点:
(1).定位第i个结点.让指针q指向第i个结点,指针p指向要插入的结点.
(2).链接后面的指针:p->next=q->next.
(3).链接前面指针:q->next=p.
插入新结点时,可能遇到两种特殊情况:
其一是向空表中插入新节点,其二是向链表最后一个元素后面插入一个新结点.
删除节点:删除链表中第i个结点:
(1).定位第i-1个结点位置.指针q指向第i-1个结点,指针p指向被删除结点.
(2).摘链:q->next=p->next.
(3).释放结点p:free(p)
2.本周的内容,你还不会什么
链表的操作还不太熟悉,尤其是链表的增加和删除。