单向链表的建立
题目描述
【链表的分类】
链表一般有单向链表、双向链表、循环链表。
单链表指的是链表中的元素的指向只能指向链表中的下一个元素或者为空,元素之间不能相互指向。也就是一种线性链表。
双向链表即是这样一个有序的结点序列,每个链表元素既有指向下一个元素的指针,又有指向前一个元素的指针,其中每个结点都有两种指针,即left和right。left指针指向左边结点,right指针指向右边结点。
循环链表指的是在单向链表和双向链表的基础上,将两种链表的最后一个结点指向第一个结点从而实现循环。
【认识单向链表】
链表这类数据结构,有点像生活中的火车,一节车厢连着下一节车厢,在火车里面,只有到了4号车厢你才能进入5号车厢,一般情况下,不可能直接在3号车厢绕过4号车厢进入5号车厢。不过更准确来说,火车是双向链表,也就是说在4号车厢也可以反向进入3号车厢。
那么如何来表示链表呢?
链表是一种特殊的结构体,创建链表只需要下面这些代码:
struct node
{
int num;
struct node *next;
};
struct node有两个成员(int, struct node),在这个结构中,int类型非常的平淡无奇,而struct node本来是我们定义的结构体。
next这个特殊的指针,指向另一个结构,而这个结构同样拥有一个指向其他结构的指针,就构成了这样一个关系:
循环下去,就会产生一条“链”.
输入
输入一些整数,均为大于0的数,直到输入一个负数为止。
要求把所有的正整数,建立一个单向链表。
输出
按照顺序输出链表的值
样例输入
1 2 3 4 5 6 -1
样例输出
1
2
3
4
5
6
提示
#include<iostream>
#include<malloc.h>
using namespace std;
struct node
{
int num;
____________;//如何定义
};
int main()
{
struct node *head,_________;//还有哪些要定义
int num;
head = tail = ______;//初始化为多少?
scanf("%d", &num);
while(num > 0)
{
p = (______) malloc(_________);//如何申请内存
p->num = num;
p->next = NULL;
if(_________) //当没有结点时,也就是head指向空时
_________//应当把head指向头结点
else
________//否则应当把尾巴结点指向新建结点
tail = p;
scanf("%d", &num);
}
for(p=head;p!=NULL;p=p->next)
{
//cout<<p->num<<endl; cout输出可能会超时
_______________
}
return 0;
}
代码补全
#include<iostream>
#include<malloc.h>
using namespace std;
struct node {
int num;
struct node *next;
};
int main() {
struct node *head,*tail,*p;
int num;
head = tail =NULL;
scanf("%d", &num);
while(num > 0) {
p = (struct node *) malloc(sizeof(node));
p->num = num;
p->next = NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail = p;
scanf("%d", &num);
}
for(p=head; p!=NULL; p=p->next) {
printf("%d\n",p->num);
}
return 0;
}
AC