在作学校的PTA作业时发现,如果不追求运行效率的话,可以先写出一些实用的方法,之后进行组装就,(其实就是进行模块化设计),这样就可以提高编写效率了。
1.下面是做题时比较实用的方法:
(因为以完成PTA的作业为目标,所以很多用户可能输入的,情况都没有考虑在内,有需要的可以自己改一改,再次强调,时空开销很大!!真的很大!!但是简化了使用)很多函数都是拿前面已经编写过的函数改的,所以注释可能有点问题:
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct {
int data;
struct LNode* next;
}LNode, *LinkList;
//初始化并创建一个空列表
LinkList newList() {
//声请一块空间作为头节点
LinkList List = (LinkList*)malloc(sizeof(LinkList));
//让他的next指向空
List->next = NULL;
//将这个只有头节点的单链表返回回去
return List;
}
//添加元素的方法
int append(LinkList L,int num) {
//1先申请一块空间,用于存放新的数据
LinkList newNode = (LinkList*)malloc(sizeof(LinkList));
//2把要存放的数据放进去
newNode->data = num;
newNode->next = NULL;
//3现在就需要找到为尾节点,然后将新节点挂上去就好
//3.1定义尾节点指针
LinkList tail;
//3.2让这个指针都指向传入的列表的头节点;
tail = L;
//如果这个节点的next不为空,就证明他不是最后一个节点
while (tail->next!=NULL) {
//尾指针就指向下一个节点
tail = tail->next;
}
//反之则为最后一个节点,然后就将这个节点(最后一个节点)的next指向新节点
tail->next = newNode;
return num;
}
//查看所有元素的方法
bool displayAllElement(LinkList L) {
if (L->next == NULL) {
printf(NULL);
return false;
}
//定义一个搜索指针,指向头节点的next
LinkList p = L->next;
//一直遍历到尾指针的next为空为止(下面的输出只是为了适应PTA的常见输出格式)
if (p != NULL) {
printf("%d", p->data);
p = p->next;
}
while (p!= NULL) {
printf(" %d", p->data);
p = p->next;
}
if (p == NULL) {
printf("\n");
}
return true;
}
//获取链表长度
int len(LinkList L) {
int length = 0;
//定义一个搜索指针,指向头节点的next
LinkList p = L->next;
//一直遍历到尾指针的next为空为止
while (p != NULL) {
length++;
p = p->next;
}
return length;
}
//根据索引获取元素
int getOfIndex(LinkList L,int index) {
int element=NULL,i=0;
if (L->next == NULL) return NULL;
//定义一个搜索指针,指向头节点的next
LinkList p = L->next;
//一直遍历到尾指针的next为空为止
while (p != NULL,i<index) {
i++;
p = p->next;
}
element = p->data;
return element;
}
//插入方法
bool insert(LinkList L, int index,int num) {
if (index < 1) return false;
int element = NULL, i = 0;
//定义一个搜索指针,指向头节点的next
LinkList p = L->next;
//一直遍历到尾指针的next为空为或者到到索引处止
while (p != NULL, i < index-2) {
i++;
p = p->next;
}
//1先申请一块空间,用于存放新的数据
LinkList newNode = (LinkList*)malloc(sizeof(LinkList));
//2把要存放的数据放进去
newNode->data = num;
//新节点的next指向原来处在本位置的节点
newNode->next = p->next;
//前一个结点指向本节点
p->next = newNode;
return true;
}
//根据索引返回元素
int getElement(LinkList L, int index) {
int i = 0;
//定义一个搜索指针,指向头节点的next
LinkList p, q;
p = q = L->next;
//一直遍历到尾指针的next为空为或者到到索引处止
while (p != NULL, i < index) {
i++;
p = p->next;
}
return p->data;
}
//删除元素的方法
//根据下标删除
bool deletOfIndex(LinkList L, int index) {
int i = 0;
//定义一个搜索指针,指向头节点的next
LinkList p, q;
p=q= L->next;
//一直遍历到尾指针的next为空为或者到到索引处止
while (p != NULL, i < index-1) {
i++;
p = p->next;
}
q = p->next;
p->next= q->next;
}
//删除某元素
int deletOfElement(LinkList L, int num) {
int i=0,index=0;
//定义一个搜索指针,指向头节点的next
LinkList p, q;
p =q= L;
if (p==NULL) {
return false;
}
//遍历判断下一个元素是不是要删除的元素
while (q->next != NULL) {
q = q->next;
if (q->data==num) {
p->next = q->next;
continue;
}
p = q;
}
return index;
}
int main()
{
//在这里调用方法
}
2.PTA作业部分:
2.1:有序链表的归并
分数 10
全屏浏览题目
切换布局
分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个有序单链表,并依次输出合并后的单链表数据。
输入格式:
测试数据有多组,处理到文件尾。对于每组测试,第一行输入M与N的值;第二行依次输入M个有序的整数;第三行依次输入N个有序的整数。
输出格式:
对于每组测试,输出合并后的单链表所包含的M+N个有序的整数。
输入样例:
6 5
1 23 26 45 66 99
14 21 28 50 100
2 2
1 2
1 3
输出样例:
1 14 21 23 26 28 45 50 66 99 100
1 1 2 3
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct {
int data;
struct LNode* next;
}LNode, *LinkList;
LinkList newList() {
LinkList List = (LinkList)malloc(sizeof(LinkList));
List->next = NULL;
return List;
}
bool displayAllElement(LinkList L) {
if (L->next == NULL) {
return false;
}
LinkList p = L->next;
if (p != NULL) {
printf("%d", p->data);
p = p->next;
}
while (p!= NULL) {
printf(" %d", p->data);
p = p->next;
}
if(p== NULL){
printf("\n");
}
return true;
}
int append(LinkList L,int num) {
LinkList newNode = (LinkList)malloc(sizeof(LinkList));
newNode->data = num;
newNode->next = NULL;
LinkList tail;
tail = L;
while (tail->next!=NULL) {
tail = tail->next;
}
tail->next = newNode;
return num;
}
void function(int a,int b){
LinkList list=newList();
int temp;
int c=a+b;
int array[100];
for(int j=0;j<c;j++){
if(scanf("%d",&array[j]));
}
for(int i=0;i<c;i++){
for(int k=0;k<c-i-1;k++){
if(array[k]>array[k+1]){
temp=array[k+1];
array[k+1]=array[k];
array[k]=temp;
}
}
}
for(int i=0;i<c;i++){
append(list,array[i]);
}
displayAllElement(list);
}
#include<stdio.h>
int main()
{
int a,b;
while (scanf("%d %d", &a,&b)!=EOF)
{
function(a,b);
}
return 0;
}
2.2两个递增链表的差集 - 人邮DS(C 第2版)线性表习题2(4)
分数 10
全屏浏览题目
切换布局
已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集C(即仅由在A中出现而不在B中出现的元素所构成的集合),并将差集C以同样的形式存储,同时返回该集合C的元素个数。
输入格式:
输入两组数据为元素递增的数组,并构成两个链表A和B。
每一组数据的第一行输入数组长度,第二行输入递增数组。
输出格式:
输出链表C表示的差集的长度和元素。
输入样例:
5
1 3 5 7 9
3
2 3 5
输出样例:
3
1 7 9
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct {
int data;
struct LNode* next;
}LNode, *LinkList;
LinkList newList() {
LinkList List = (LinkList)malloc(sizeof(LinkList));
List->next = NULL;
return List;
}
int len(LinkList L) {
int length = 0;
LinkList p = L->next;
while (p != NULL) {
length++;
p = p->next;
}
return length;
}
int getElement(LinkList L, int index) {
int i = 0;
LinkList p, q;
p = q = L->next;
while (p != NULL&&i < index) {
i++;
p = p->next;
}
return p->data;
}
int append(LinkList L,int num) {
LinkList newNode = (LinkList)malloc(sizeof(LinkList));
newNode->data = num;
newNode->next = NULL;
LinkList tail;
tail = L;
while (tail->next!=NULL) {
tail = tail->next;
}
tail->next = newNode;
return num;
}
int displayAllElement(LinkList L) {
int length = 0;
if (L->next == NULL) {
return false;
}
LinkList p = L->next;
if (p != NULL) {
printf("%d", p->data);
length++;
p = p->next;
}
while (p!= NULL) {
printf(" %d", p->data);
length++;
p = p->next;
}
if(p== NULL){
printf("\n");
}
return length;
}
int main(){
LinkList A=newList();
LinkList B=newList();
LinkList C=newList();
int a,b,temp;
if(scanf("%d",&a));
for(int i=0;i<a;i++){
if(scanf("%d",&temp));
append(A,temp);
}
if(scanf("%d",&b));
for(int i=0;i<b;i++){
if(scanf("%d",&temp));
append(B,temp);
}
int count=0;
for(int i=0;i<a;i++){
int first=getElement(A,i);
for(int j=0;j<b;j++){
int second=getElement(B,j);
if(first!=second){
count++;
}
}
if (count==b){
append(C,first);
}
count=0;
}
printf("%d\n",len(C));
displayAllElement(C);
return 0;
}
2.3将单链表倒置,要求只利用原表的存储空间。
原单链表如下所示:
倒置后的单链表应为:
输入格式:
第一行输入n的值,表示单链表的元素个数。
第二行输入n个整数值,作为单链表的各元素值。
输出格式:
输出倒置后的单链表的各元素值,各元素值之间用空格分隔。
输入样例1:
4
2 4 6 8
输出样例1:
8 6 4 2
输入样例2:
7
1 3 5 7 9 11 13
输出样例2:
13 11 9 7 5 3 1
4
2 4 6 8
8 6 4 2
代码长度限制
16 KB
时间限制
400 ms
内存限制
16 MB
代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct {
int data;
struct LNode* next;
}LNode, *LinkList;
LinkList newList() {
LinkList List = (LinkList)malloc(sizeof(LinkList));
List->next = NULL;
return List;
}
int getElement(LinkList L, int index) {
int i = 0;
LinkList p, q;
p = q = L->next;
while (p != NULL&&i < index) {
i++;
p = p->next;
}
return p->data;
}
int append(LinkList L,int num) {
LinkList newNode = (LinkList)malloc(sizeof(LinkList));
newNode->data = num;
newNode->next = NULL;
LinkList tail;
tail = L;
while (tail->next!=NULL) {
tail = tail->next;
}
tail->next = newNode;
return num;
}
int main(){
LinkList L=newList();
int len,temp;
if(scanf("%d",&len));
int i=0;
for(i;i<len;i++){
if(scanf("%d",&temp));
append(L,temp);
}
i--;
for(i;i>=0;i--){
printf("%d ",getElement(L,i));
}
return 0;
}