假设有一组数列由小到大排序,{1,5,9,8,12,49},那么要向这个数列中插入一个数字6,并且不破坏它本身的特点(由小到大),那么常规方法是找到第一个比6大的数字,然后在这个数字前面添上6,然后后面的数字的下表全部加一,这种方法十分低效,所以我们现在可以用到链表的知识来解决这个问题
1.首先现介绍malloc函数,它的作用是从内存中申请分配指定空间大小的内存空间
#include <stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int *p;//建立指针p
p=(int *)malloc(sizeof(int));
return 0;
}
这段代码为p这个指针指向了 一个内大小为一个整数的空间
2.接下来我们来建立一个链表
2.1链表的结构如下
data | *next |
data用于储存数据,next用于指向下一个结构点的地址
2.2建立一个链表
#include <stdio.h>
#include<stdlib.h>
//用结构体来表示链表结构
struct node{
int data;
struct node *next;
};
int main(int argc, char *argv[])
{
struct node *head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head=NULL;
for(i=0;i<n;i++)
{
int a;
scanf("%d",&a);//输入数字
p=(struct node *)malloc(sizeof(struct node));//让当前的p指针指向申请的空间
p->data=a;//为这个空间附值
p->next=NULL;//这个空间的下一个空间暂时为空
if(head==NULL)//如果是第一个空间那么head应该指向第一个空间
{
head=p;
}
else
{
q->next=p;//否则上一个空间的指针应该指向当前空间
}
q=p;//储存当前空间的地址下一个循环用
}
t=head;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->next;//继续下一个节点
}
printf("\n");
return 0;
}
2.3 向上衣链中插入一个值
#include <stdio.h>
#include<stdlib.h>
//用结构体来表示链表结构
struct node{
int data;
struct node *next;
};
int main(int argc, char *argv[])
{
struct node *head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head=NULL;
for(i=0;i<n;i++)
{
int a;
scanf("%d",&a);//输入数字
p=(struct node *)malloc(sizeof(struct node));//让当前的p指针指向申请的空间
p->data=a;//为这个空间附值
p->next=NULL;//这个空间的下一个空间暂时为空
if(head==NULL)//如果是第一个空间那么head应该指向第一个空间
{
head=p;
}
else
{
q->next=p;//否则上一个空间的指针应该指向当前空间
}
q=p;//储存当前空间的地址下一个循环用
}
printf("输入要插入的值:\n");
int c;
struct node *need;
scanf("%d",&c);
need=(struct node *) malloc(sizeof(struct node));
need->data=c;
need->next=NULL;
t=head;
while(t!=NULL)
{
if((t->next->data)>c||t->next==NULL)
{
need->next=t->next;
t->next=need;
break;
}
t=t->next;
}
t=head;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->next;
}
printf("\n");
return 0;
}