题目一:正向建链表
输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。
输入格式:
第一行输入整数的个数N;
第二行依次输入每个整数。
输出格式:
输出这组整数。
输入样例:
8
12 56 4 6 55 15 33 62
输出样例:
12 56 4 6 55 15 33 62
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}node;
node* creat(int n){
node *head,*tail,*p;
int i;
head=malloc(sizeof(node));
head->next=NULL;
tail=head;
for(i=0;i<n;i++){
p=malloc(sizeof(node));
p->next=NULL;
scanf("%d",&p->data);
tail->next=p;
tail=p;
}
return head;
}
int main(){
int n,i;
scanf("%d",&n);
node *head,*p;
head=malloc(sizeof(node));
head->next=NULL;
head=creat(n);
p=malloc(sizeof(node));
p->next=NULL;
p=head->next;
for(i=0;i<n;i++){
printf("%d",p->data);
if(i<n-1)printf(" ");
p=p->next;
}
return 0;
}
思路:
先定义结点
调用创建链表的函数
最后按照格式输出
其中创建链表的函数中,我们先定义一个空的头节点,在定义一个尾结点,虽然这里没有使用malloc对尾结点分配内存,但是因为已经对head结点分配的内存,而且head是指针,指针返回的是地址,也就是此时讲地址给了tail
之后进行循环,建立n个结点
每一个结点首先就是分配内存,指针后继是空,输入数据域的值
最后链接到链表中,
p=tail->next;
tail已经在里面了,如果是翻过来的话,不是对新结点的操作
输出方面
我们先定义一个头结点来接i收函数返回的头结点,由于头节点是空的,所以输出的话是从头节点后的第一个结点开始输出
创建结点来指向头节点之后的结点·
head=creat(n);
p=head->next;
最后输出的时候,不要忘记将这个结点不断的后移
p=p->next;
题目二
输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据。
输入格式:
第一行输入整数N;;
第二行依次输入N个整数,逆序建立单链表。
输出格式:
依次输出单链表所存放的数据。
输入样例:
10
11 3 5 27 9 12 43 16 84 22
输出样例:
22 84 16 43 12 9 27 5 3 11
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
思路:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}node;
node* creat(int n){
int i;
node *head,*p;
head=malloc(sizeof(node));
head->next=NULL;
for(i=0;i<n;i++){
p=malloc(sizeof(node));
scanf("%d",&p->data);
//反向建立
p->next=head->next;
head->next=p;//插入新的结点,同反向建链表的过程
}
return head;
}
int main(){
int n,i;
scanf("%d",&n);
node *head,*p;
head=malloc(sizeof(node));
head->next=NULL;
head=creat(n);
p=head->next;
for(i=0;i<n;i++){
printf("%d",p->data);
if(i<n-1)printf(" ");
p=p->next;
}
return 0;
}
在这里反向见链表过程
重点说一下建立函数
输出接收等过程同上一题
函数:先建立空的头节点,对于每一个新节点先开辟内存,输入数据区域
反向建就是最早输入的是最后一个结点
对于新的结点,我们先将其后继指针修改为原来头节点的指针指向,在
head->next=p;这里跟反向建立链表一样,tail->next=p;作用都是讲新进的结点插入到链表中
关键是上一步,我们不能先修改头节点的后继,因为修改后原来头节点的后继就丢失
我们 p->next=head->next;
所以后面每一个进来的结点都是在头结点的后继,紧紧跟着头结点,排第二位
就实现了反向建立的过程