#include <stdio.h>
#include <malloc.h>
typedef struct Node //定义结构体
{
int data; //数据域
struct Node *next; //指针域
}Node; //重命名
Node *list()
{
Node *head=NULL,*tail=NULL; //设定一个头指针和一个尾指针 (这里用的是尾插法,符合常用习惯)
int count; //定义一个变量 这个变量存一个多少个元素
printf("input all number's number:");
scanf("%d",&count);
for(int i=1;i<=count;i++) //开始循环输入元素
{
printf("input No%d number:",i);
Node *num=(Node *)malloc(sizeof(Node)); //因为是插入,所以插入的数应该有指针域和数据域,以匹配单链条每个元素之间相连的格式.
scanf("%d",&num->data);
num->next=NULL; //这里每次新的插入数的next指针要先赋值NULL不然会系统会乱给他赋值
if(head==NULL) //如果头指针是空的 那么就先赋值给它 tail因为是尾指针 所以也要赋值
{
head=tail=num;
}
else
{
tail->next=num; //当头指针不是空值时,那接下来的就和头指针没关系了,只和尾指针有关系, 因为num每次都会重新搞一个空间给它,所以tail的next指针指向它来保证在循环还没有结束之前tail后面都还会有节点给它
tail=num; //这里来确保tail表示的是最后一个节点
}
}
return head;
}
Node *insert(Node *head)
{
if(head==NULL) //这里因为不确定用户给你的head是不是空值 所以弄这一步是为了保险
{
return NULL;
}
Node *new_num=(Node *)malloc(sizeof(Node)); //与上文插入数同理
printf("please in put u want to insert number:\n");
scanf("%d",&new_num->data);
new_num->next=NULL; //至此与上文同理
Node *No1_head=NULL,*No2_head=NULL; //弄两个连续的指针方便后面指针的运用(指向)
No1_head=No2_head=head;
while(No2_head != NULL && No2_head->data < new_num->data)
//插入的数可能会大于单链条最大的数 所以弄No2_head != NULL这个条件是为了不让它无限循环 ,相反 要让连续的指针其中的前一个指向new_num节点的前一个节点,而后一个指针要指向new_num的后一个节点,这样这三个节点就可以用它们的next指针把他们串联起来了
{
No1_head=No2_head;
No2_head=No2_head->next; //找到插入的位置
}
if(No1_head == No2_head) //有一种情况就是插入的数就是头指针的值或是比头指针小的数
{
new_num->next = head;//原来的头指针向后移一个节点,而新节点代替头指针;
return new_num; //这里要注意 如果返回new_num 下面的程序就不会再运行了(所以下面没有写else
}
No1_head->next = new_num;
new_num->next = No2_head;//用每个节点的next指针把他们相连
return head;
}
void read(Node *head)
{
while(head!=NULL)
{
printf("%3d",head->data);
head=head->next; //head不断向后移一个节点一直到head=NULL结束
}
}
int main()
{
Node *head=list(); //调用创建单链条函数
Node *new_head = insert(head); //调用插入函数
read(new_head); //调用遍历函数
}