链表(二)

链表(二)

二、链表遍历和增删改查

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;
	}
}

后言:关于单链表基本操作就结束了,链表(一)是关于链表的建立问题,本篇链表(二)是关于增删改查和遍历,后续随着学习的深入,后续学习中遇见算法和更多链表应用,会持续更博,新手上路,希望大家多多指教,有问题可以指出,感谢阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值