单链表的插入属于单链表的基本操作之一,关于单链表的初始化的解释在我的上篇文章中已经详细说明过了。
一、求单链表长度
求单链表长度的操作很简单,其实在初始化赋值或遍历那块就可以实现,但是为了让结构层次独立清楚,我还是把求长度写成了一个函数。
单链表插入的关键部分如下:(本质上还是遍历)
int seqlistlength(Link head){
Link p;
int count=0;
p=head->next;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}
二、单链表插入操作
while(i!=x){ //让p指向第x-1的位置
p=p->next;
i++;
}
s->next=p->next;
p->next=s;
printf("请输入要插入的值:");
scanf("%d",&s->data);
return 1;
整体代码如下:
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
int data;
struct node *next;
}Node,*Link;
//求单链表长度
int seqlistlength(Link head){
Link p;
int count=0;
p=head->next;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}
//单链表赋值操作
int createLinklist(Link head){
int c;//c是给链表输入的值
char ch;
Link p,q;//p是每个新的结点,q指向新的结点
q=head;
while(ch!='\n')
{
p=(Link)malloc(sizeof(Node));
scanf("%d",&c);
p->data=c;
q->next=p;
p->next=NULL;
q=p;
ch=getchar();
}
q->next=NULL;
return 1;
}
//插入操作
int insert(Link head,int x){//x表示插入位置
int i=1;
int count;//单链表的长度
count=seqlistlength(head);
Link p,s;
s=(Link)malloc(sizeof(Node));
p=head;
if(x<=0 || x>count+1){
printf("插入位置错误\n");
return 0;
}
while(i!=x){ //让p指向第x-1的位置
p=p->next;
i++;
}
s->next=p->next;
p->next=s;
printf("请输入要插入的值:");
scanf("%d",&s->data);
return 1;
}
//遍历输出
int show(Link head){
Link p;
p=(Link)malloc(sizeof(Node));
p=head->next;
while(p!=NULL){
printf("%d,",p->data);
p=p->next;
}
return 1;
}
int main(){
int a,b;//a是插入位置,b是insert的返回值
Link head;
head=(Link)malloc(sizeof(Node));
//创建了一个单链表,设置头结点head
head->next=NULL;
printf("创建一个链表\n");
printf("请输入单链表的元素(用逗号隔开,回车结束):\n");
createLinklist(head);
printf("遍历单链表并输出:");
show(head);
printf("\n请输入你要插在第几个位置(从1开始):");
scanf("%d",&a);
b=insert(head,a);
if(b==1){
printf("插入后的链表为:");
show(head);
}
return 0;
}