A - 数据结构实验之链表一:顺序建立链表
Description
输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。
Input
第一行输入整数的个数N;
第二行依次输入每个整数。
Output
输出这组整数。
Sample
Input
8
12 56 4 6 55 15 33 62
Output
12 56 4 6 55 15 33 62
Hint
不得使用数组!
分析
顺序建立链表即尾插式
//在尾部插入需要定义一个结构体类型的尾部指针去记录插入结点的位置
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*tail;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
tail=head;//头和尾都指向空的结点
int n;
scanf("%d",&n);
while(n--)
{
p=(struct node *)malloc(sizeof(struct node*));//创建新结点p
scanf("%d",&p->data);//并为新结点的数据域赋值
tail->next=p;//将新结点插入表尾
p->next=NULL;//尾结点置空
tail=p;//修改tail使其指向表尾(等待新结点的插入)
}
p=head->next;
while(p)
{
if(p!=NULL)
printf("%d ",p->data);
else printf("%d\n",p->data);
p=p->next;
}
return 0;
}
当然这也可使用自定义函数
#include <stdio.h>
#include <stdlib.h>
typedef struct Node//重新命名
{
int data;//数据域
struct Node *next;//指针域
} node,*per;//结点类型名与指针类型名
//其中struct Node==node;
//struct Node*==per 等价,都为指向node的指针类型
//当然也可不用per,单用node也可
node *creatlist(int n)//创建尾插式链表
{
node *head,*p,*tail;
head=(per)malloc(sizeof(node));
tail=head;
while(n--)
{
p=(per)malloc(sizeof(node));
scanf("%d",&p->data);
tail->next=p;
p->next=NULL;
tail=p;
}
return head;
}
void print(node *head)//链表输出函数
{
node *p;
p=head->next;
while(p)
{
if(p!=NULL)
printf("%d ",p->data);
else printf("%d\n",p->data);
p=p->next;
}
}
int main()
{
int n;
scanf("%d",&n);
node *head;
head=creatlist(n);
print(head);
return 0;
}
B - 数据结构实验之链表二:逆序建立链表
Description
输入整数个数N,再输入N个整数,按照这些整数输入的相反顺序建立单链表,并依次遍历输出单链表的数据。
Input
第一行输入整数N;;
第二行依次输入N个整数,逆序建立单链表。
Output
依次输出单链表所存放的数据。
Sample
Input
10
11 3 5 27 9 12 43 16 84 22
Output
22 84 16 43 12 9 27 5 3 11
Hint
不能使用数组!
//逆序建立链表其实就是头插式
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p;
head=( struct node *)malloc( sizeof(struct node));
head->next=NULL;//建立一个空链表
int n;
scanf("%d",&n);
while(n--)
{
p=( struct node*)malloc(sizeof( struct node));
scanf("%d",&p->data);
p->next=head->next;//插入的新结点在头的后面
head->next=p;//p的位置始终在头后
}
p=head->next;
while(p)
{
if(p!=NULL)
printf("%d ",p->data);
else printf("%d\n",p->data);
p=p->next;
}
return 0;
}
C - 师–链表的结点插入
Description
给出一个只有头指针的链表和 n 次操作,每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。
Input
多组输入。每组数据首先输入一个整数n(n∈[1,100]),代表有n次操作。
接下来的n行,每行有两个整数Mi(Mi∈[0,10000]),Xi。
Output
对于每组数据。从前到后输出链表的所有元素,两个元素之间用空格隔开。
Sample
Input
4
1 1
1 2
0 3
100 4
Output
3 1 2 4
Hint
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q;
int n,a,b;
while(~scanf("%d",&n))
{
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
while(n--)
{
scanf("%d %d",&a,&b);
p=head;
while(a--&&p->next!=NULL)//存在两种要么在链表未为空时找到,要么一直未找到直至为空
{
p=p->next;//从头开始寻找
}
q=(struct node *)malloc(sizeof(struct node));
q->next=NULL;
q->data=b;
q->next=p->next;//连接链表的过程
p->next=q;
}
p=head->next;
while(p)
{
if(p->next!=NULL)
printf("%d ",p->data);
else
printf("%d\n",p->data);
p=p->next;
}
}
return 0;
}
重要的是要找到准确的结点,并进行插入
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node*next;
}Node;
Node *insert_linkedlist(Node *head,int a,int b)
{
Node *q,*p;
p=head;
while(a--&&p->next!=NULL)//核心代码就是寻找的过程
p=p->next;
q=(Node *)malloc(sizeof(Node));
q->data=b;
q->next=NULL;
q->next=p->next;
p->next=q;
return head;
}
void print(Node *head)
{
Node *p;
p=head->next;
while(p)
{
if(p->next!=NULL)
printf("%d ",p->data);
else printf("%d\n",p->data);
p=p->next;
}
}
int main()
{
int a,b,n;
Node *head,*p;
while(~scanf("%d",&n))
{
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
while(n--){
scanf("%d %d",&a,&b);
p=insert_linkedlist(head,a,b);
}
print(p);
}
return 0;
}
这第三道题
思路来自这里