链表(二)
二、链表遍历和增删改查
1.遍历:
思路:
①已知头指针,定义一个头指针从链表的头指针的指针域开始访问
②访问该指针的数据
③移动该指针,使它指向下一个节点
④循环,直到指针指向为空,结束。
完整代码:
void print ( linklist L )//遍历链表
{
node *p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
2.增加结点:
思路:(和插入类似,参考链表建立(一))
如果插到想插入的数字后面:
建立要插入的结点(s),找到插入位置的前区结点(p),连接
图示:
核心代码:
s->next = p->next;
p->next = s;
完整代码:
void add(linklist L)
{
node *s,*p;
int x;
p=L;
printf("输入要插入几的后面:");//
scanf("%d",&x);
while(p&&p->data!=x)//找到插入位置的前区结点p
{
p=p->next;
}
if(p==NULL)
{
printf("未找到!\n");
}
else
{
printf("输入要插入数:");
s=(node*)malloc(sizeof(node));
scanf("%d",s);
s->next = p->next;
p->next = s;
}
}
2.删除结点:
思路:需要找到要删除节点(p)和它的前一个节点(q),连接删除节点的前后节点,释放删除节点所占的空间
图示:
核心代码:
q->next=p->next;
完整代码:
void delL(linklist L)
{
node *p,*q;
int x;
p=L;
printf("please input data you want to delete : ");
scanf("%d",&x);
while(p&&p->data!=x)
{
q=p;//q为p前区结点
p=p->next;//从头结点遍历至要删除的结点
}
if(p==NULL)
{
printf("未找到!\n");
}
else
{
q->next=p->next;//删除
printf("已删除!\n");
free(p);
}
}
3.查找:
思路:遍历链表,找到该结点,对数据域进行操作
void search(linklist L)
{
node *p;
int x,count=0;
p=L->next;//带头结点
printf("请输入要查找的数:");
scanf("%d",&x);
while(p&&p->data!=x)
{
p=p->next;//从头结点后第一个数据后开始遍历
count++;
}
if(p==NULL)
{
printf("未找到!");
}
else
{
printf("已找到:");
printf("%d为第%d个\n",p->data,count+1);
}
}
4.修改:
思路:遍历链表,找到该结点,对数据域进行改变
int modify(linklist L)
{
node *p;
int a,x;
p=L->next;//带头结点
printf("请输入要修改的数:");
scanf("%d",&x);
while(p&&p->data!=x)//遍历
p=p->next;
if(p==NULL)
printf("未找到!");
else
{
printf("请输入改为的数:");
scanf("%d",&a);
p->data = a;
return p->data;
}
}
后言:关于单链表基本操作就结束了,链表(一)是关于链表的建立问题,本篇链表(二)是关于增删改查和遍历,后续随着学习的深入,后续学习中遇见算法和更多链表应用,会持续更博,新手上路,希望大家多多指教,有问题可以指出,感谢阅读。