今天学习链表,把最基础的应用整理出来,以作纪念
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct shulie
{
int shu;
struct shulie *next;
};
int main(void)
{
struct shulie *head = NULL; //头指针用来判断链表的开始
struct shulie *bl = NULL; //bl指针用来遍历链表找到要操作的结点
struct shulie *tmp = NULL; //临时指针
int i,j,k,x;
//首先构建有10个链结的链表以供使用
for(i = 0; i < 10; i++)
{
bl = (struct shulie *)malloc(sizeof(struct shulie));
if(head == NULL)
head = bl;
else
tmp -> next = bl;
bl -> next = NULL;
bl -> shu = i;
tmp = bl;
}
bl = head;
while(bl != NULL)
{
printf(" %d ",bl -> shu);
bl = bl -> next;
}
//在j之后插入一个数
bl = head;
printf("请输入要插入的位置:");
scanf("%d",&j);
while(bl != NULL)
{
if(bl -> shu == j)
{
tmp = (struct shulie *)malloc(sizeof(struct shulie)); //新建一个链结
printf("请输入要插入的数字");
scanf("%d",&k);
tmp -> shu = k; //将要插入的数字存放进新建链结的数据域内
tmp -> next = bl ->next; //新建链结的指针域存放bl链结指针域内的地址,即下一个链接的地址
bl -> next = tmp; //bl链结指针域内存放新建链结的地址
break;
}
bl = bl -> next;
}
//打印修改后的链表
bl = head;
while(bl != NULL)
{
printf(" %d ",bl -> shu);
bl = bl -> next;
}
//删除有关链结
bl = head;
printf("请输入要删除的链结:");
scanf("%d",&x);
while(bl != NULL)
{
if(bl -> shu == x)
{
tmp = bl -> next; //用临时指针储存要删除的链结的地址
bl -> next = tmp -> next; //将要删除的链结的后一个链结的地址存储到要删除的链结的前一个链结的指针域中
free(tmp); //释放临时指针
break;//跳出循环遍历
}
bl = bl -> next;
}
bl = head;
while(bl != NULL)
{
printf(" %d ",bl -> shu);
bl = bl -> next;
}
bl = head;
while(bl != NULL)
{
free(bl);
bl = bl -> next;
}
return 0;
}