c语言链表 习题讲解

题目一:正向建链表

输入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;

所以后面每一个进来的结点都是在头结点的后继,紧紧跟着头结点,排第二位

就实现了反向建立的过程

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值