链表是一种常见的采用动态存储分配方式的数据结构。
与数组区别
可以使用静态数组来存放数据,但使用数组时,要先指定数组中包含元素的个数,即数组长度。如果向这个数组中加入的元素个数超过了数组的长度,便不能正确保存所有的内容。也可以使用动态 数组来存放数据,根据实际元素个数动态调整数组大小,但分配的存储空间必须是连续的, 且在插入或删除等操作过程中涉及大量元素的移动。
主要介绍单链表:
定义:如果在链表中,每个结点只有一个指针,所有结点都是单线联系, 除了末尾结点指针为空外,每个结点的指针都指向下一个结点,一环扣一环形成一条线性链, 称此链表为单向线性链表或简称单链表。
链表的建立:
1.头插法:jd*,boy*为设置的结构体自定义名
void toucha(jd*head)
{
jd*q;
char name[20];
int score;
while(1)
{
scanf("%s%d",name,&score);
if(score==0)
break;
q=(jd*)malloc(sizeof(jd));
q->next=NULL;
strcpy(q->name,name);
q->score=score;
q->next=head->next;
head->next=q;
}
}
2.尾插法、
void cj(boy*head)
{
boy*p,*q;
p=head;
char name[20];
int num;
int score;
while(1)
{
scanf("%s%d%d",name,&num,&score);
if(num==0)
{
break;
}
q=(boy*)malloc(sizeof(boy));
strcpy(q->name,name);
q->num=num;
q->score=score;
p->next=q;
p=q;
}
p->next=NULL;
}
链表的遍历:
void sc(jd*head)
{
jd*p=head->next;
for(p;p;p=p->next)
{
printf("%s %d\n",p->name,p->score);
}
}
链表的插入:插入到第i个位置
void zen(jd*head)
{
int i,j=0;
scanf("%d",&i);
jd*p=head;
while(j<i-1&&p)
{
j++;
p=p->next;
}
if(p)
{
jd*q;
q=(jd*)malloc(sizeof(jd));
scanf("%s%d",q->name,&q->score);
q->next=p->next;
p->next=q;
}
链表的删除:删除第i个位置
void shan(jd*head)
{
int i,j=0;
scanf("%d",&i);
jd*p=head;
while(j<i-1&&p)
{
j++;
p=p->next;
}
if(p==NULL||p->next==NULL)
{
printf("错误");
}
else
{
jd*q;
q=p->next;
p->next=q->next;
free(q);
}
}
链表的查询:
void cha(jd*head)
{
int i,j=0;
scanf("%d",&i);
jd*p=head;
while(j<i&&p)
{
j++;
p=p->next;
}
if(p==NULL)
{
printf("没有这个数");
}
else
printf("%s %d",p->name,p->score);
}
链表的修改:
void gai(jd*head)
{
int i,j=0;
scanf("%d",&i);
jd*p=head;
while(j<i&&p)
{
j++;
p=p->next;
}
if(p==NULL)
{
printf("错误");
}
else
{
char name[20];
int score;
scanf("%s%d",name,&score);
strcpy(p->name,name);
p->score=score;
}
}