链表是一个很常用的结构。主要分为头结点和各个结点,相互链接起来。
结构如图所示
链表的删除、增加、查找都是对结点进行操作。
增加是将数据储存在一个节点中,再将该节点与原有的链表相链接,单链表根据插入位置的不同,分为头插,尾插,中间插入。
删除是对对应节点的删除,将后指针p直接指向前指针q的下一个。
查询是对用户提供的东西进行查询,可以使节点序号·,节点数据...依照这些查询想要的结果。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**结构体**/
typedef struct Link
{
int data;
struct Link *next;
}link;
link *L=NULL;
/**创建**/
void creatL()
{
L=(link*)malloc(sizeof(link));//申请空间
L->next=NULL;//指向空
printf("创建成功!\n");
}
/**输出链表**/
void prinL()
{
link *p;
p=L;
while(p->next!=NULL)
{
p=p->next;
printf(" %d ",p->data);
}
}
/**增加**/
void InitL()
{
int n;//n代表一共要加入几个数据
link *q,*p;//利用指针q、p进行链表的增加
p=L;//将p指向头结点
scanf("%d",&n);
for(int i=0;i<n;i++)
{
q=(link *)malloc(sizeof(link));//申请空间
scanf("%d",&q->data);
p->next=q;//将p、q节点相连接起来
p=p->next;//将p指针移动到下一位
}
p->next=NULL;//将p的下一位指向空
printf("增加成功!\n");
}
/**删除**/
void deteL()
{
int n;//n代表一共要删除的数据
link *q,*p;//利用指针q、p进行链表的增加
p=L;//将p指向头结点
q=p->next;//将q指向p的下一个
scanf("%d",&n);
while(p->next!=NULL)
{
if(q->data==n)//如果找到想要删除的节点
{
p->next=q->next;//将p的下一个指向q的下一个
free(q);//释放q
p=q->next;
break;
}
p=p->next;//移动指针q、p方便寻找删除结点
q=q->next;
}
printf("删除成功!\n");
}
/**查找**/
void searchL()//查找第n个结点数值
{
int n;//第n个结点
int a=1;//用于计数
link *p,*q;
p=L;
q=p->next;
scanf("%d",&n);
while(p->next!=NULL)
{
if(a==n)//若找到
{
printf("该节点为:%d",q->data);
break;
}
p=p->next;
q=q->next;
a++;
}
}
/**主函数**/
int main(void)
{
creatL();
InitL();
searchL();
deteL();
prinL();
return 0;
}
运行结果: