#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *p;
}*Node;//申明一个结构体,并申明一指针型结构体变量Node
int main()
{
Node head,tail;//头指针
head=(struct node *)malloc(sizeof(struct node));
head->p=NULL;//此时头节点head的data并没有数据,且其指向为空
tail=head;//使用尾插法tail指向头节点
int n;
scanf("%d",&n);//向链表输入n个数
int num;
while(n--)
{
scanf("%d",&num);
Node temp=(Node)malloc(sizeof(struct node));//申明一个临时结构体指针存储输入的数据
temp->data=num;
temp->p=tail->p;//临时指针指向tail的NULL,此时temp到了最后的位置
tail->p=temp;//tail要连接temp,不然的话链表就链接不起来,此时temp结点是tail的后续结点
tail=temp;//移动tail指针的位置到temp结点,temp是最后结点
}
puts("链表已经构造完成!");
Node traverse;//遍历指针
traverse=head->p;//head是头节点并没有信息,所有要指向他的下一个结点
while(traverse!=NULL)//只要指针不指向NULL则一直遍历
{
printf("%d%s",traverse->data,traverse->p==NULL ? "\n" : "->");//输出traverse结点的值
traverse=traverse->p;//输出玩本节点就指向下一个结点
}
//此时已经输出完所有结点了
puts("请输入你要插入的数");
int insert;
scanf("%d",&insert);
traverse=head;//继续使用之前申明的指针traverse来完成遍历任务,找到比输入值大的那个结点指针
while(traverse->p->data<insert && traverse->p!=NULL)//这里不能使用traverse!=NULL,因为要是插入到最后一个位置,那就是地址NULL了,插不进去了
traverse=traverse->p;
//此时traverse找到了比插入值大的结点的前一个位置,也可能没有比他大的结点,现在是最后一个节点位置
//申明一个临时结点指针,把输入插入
Node temp=(Node)malloc(sizeof(struct node));
temp->data=insert;//这一步赋值
temp->p=traverse->p;//插入节点要连接traverse后面那个结点
traverse->p=temp;//然后traverse连接插入节点
puts("插入成功");
puts("输出链表");
traverse=head->p;//head是头节点并没有信息,所有要指向他的下一个结点
while(traverse!=NULL)//只要指针不指向NULL则一直遍历
{
printf("%d%s",traverse->data,traverse->p==NULL ? "\n" : "->");//输出traverse结点的值
traverse=traverse->p;//输出玩本节点就指向下一个结点
}
return 0;
}
result:
4
1 3 5 7
The linked list has been constructed!
1->3->5->7
Please enter the number you want to insert.
4
is inserted successfully.
The output linked list
is 1->3->4->5->7.