写这篇博客的原因是因为接触了链表后发现她的头插尾插非常神奇啊(kanbudong)!!!所以在查了一些博客搜集了一些通俗易懂的头插尾插方法在此总结!!!
头插!
头插就是不断地往头指针后面插入结构体已构成链表废话不多说上代码!
typedef struct Node{//定义结构体
int data;
struct Node *next;
}Lnode,*Linklist;
Linklist Creat_list(Linklist head){
head=(Linklist)malloc(sizeof(Lnode));//给头指针开辟空间
Lnode*node=NULL;//定义一个节点
int n=4;
head->next=NULL;
//这里很重要
node=head->next;///将最后一个节点指针永远保持为NULL
for(int i=0;i<4;i++){
node=(Linklist)malloc(sizeof(Lnode));//给节点申请空间
node->data=i;
node->next=head->next;//记住这是头插,始终往头后面插入
head->next=node;
}
}
//我学习的时候经常看见有的代码光有函数没主函数,我这人笨,没主函数不会调用
//所以这里把主函数也加上!!!!!
int main(){
Linklist head=NULL;
head=Creat_list(head);//头插
Illustrate(head);//输出函数后面说
return 0;
}
头插法其实在我目前来看不怎么用,你看哈这里代码输出为3210!也就是反着来的~要是按照输入顺序输出就不能用头插了(个人认为)所以重点来了(往下看)
尾插!
我所了解到的有两种尾插,一个带表头,一个不带表头!还是直接上代码!
//这里是不代表头的!!!
//函数的意思是在链表中存数字和字符串到输入零的时候停止
typedef struct num{
int data;
char name[20];
struct num *next;
}NUM, *linklist;
linklist input_list(){
int n;
linklist head,p,end;
head=end=NULL;//记得呀指针都要提前赋值
p=(linklist)malloc(sizeof(NUM));//开个p
scanf("%d",&p->data);
while(p->data!=0){
scanf("%s",p->name);
if(head==NULL){
head=p;
head->next=NULL;
}
if(end!=NULL){
end->next=p;
}
end=p;
p->next=NULL;
p=(linklist)malloc(sizeof(NUM));
scanf("%d",&p->data);
}
return head;
}void output_list(linklist head){//带表头和不带表头的输出函数不一样哟!
linklist q=head;
while(q){
printf("%d %s\n",q->data,q->name);
q=q->next;
}
}
int main(){
linklist head;
head=input_list();
output_list(head);
return 0;
}
带不带表头…的其实我也不知道好与坏就具体情况具体用呗!
//这里是带上表头的写法
//函数意思是输出1234;
typedef struct Node{//定义结构体
int data;
struct Node *next;
}Lnode,*Linklist;
Linklist creat_list(Linklist head){
head=(Linklist)malloc(sizeof(Lnode));//给头结点申请空间
Lnode*node=NULL;//定义节点
Linklist end=NULL;//定义尾节点
head->next=NULL;//指针得有值
end=head;
for(int i=0;i<4;i++){
node=(Linklist)malloc(sizeof(Lnode));
node->data=i;
end->next=node;
end=node;
}
end->next=NULL;
return head ;
}
void output_list(Linklist head){
Linklist tem=head;
while(tem->next!=NULL){
tem=tem->next;
printf("%d\n",tem->data);
}
}
//主函数和上面差不多就不写了