线性表——带头结点单链表的实现

/*
	带头结点的单链表
	vs2010 调试
*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct LinkNode
{
	int num;
	struct LinkNode *next;
};

//获得链表长度
int get_length(struct LinkNode *L)
{
	struct LinkNode *trace = L;
	int length = 0;
	if(trace == NULL)
	{
		return 0;
	}
	while(trace->next != NULL)
	{
		length++;
		trace = trace->next;
	}
	return length;
}

/*
插入节点
向pos的位置插入值为num的节点
*/
int insert_LinkList(struct LinkNode *L, int num, int pos)
{
	struct LinkNode *tmp_node;
	struct LinkNode *trace = L;
	if(pos < 0 || pos > get_length(L))
	{
		return 0;
	}

	tmp_node = (struct LinkNode *)malloc(sizeof(struct LinkNode));
	tmp_node->num = num;
	tmp_node->next = NULL;

	while(pos != 0)
	{
		trace = trace->next;
		pos--;
	}

	tmp_node->next = trace->next;
	trace->next = tmp_node;

	return 1;
}

/*
删除pos位置的结点链表
*/
int delete_LinkList(struct LinkNode *L, int pos)
{
	struct LinkNode *trace = L;
	struct LinkNode *p = NULL;
	if(pos <= 0 || pos > get_length(L))
	{
		return 0;
	}

	while(--pos != 0)
	{
		trace = trace->next;
	}

	p = trace->next;
	trace->next = p->next;
	free(p);

	return 1;
}

/*
搜索值为num的节点在链表中的位置
返回值:	-1 搜索失败; >-1 num的位置
*/
int search_LinkList(struct LinkNode *L, int num)
{
	int pos = 1;
	struct LinkNode *head = L->next;
	while(head != NULL)
	{
		if(head->num == num)
		{
			break;
		}
		if((head = head->next) == NULL)
		{
			return -1;
		}
		pos++;
	}

	return pos;
}

/*
更新pos位置的节点值为num,原值存入num里
*/
int update_LinkList(struct LinkNode *L, int pos, int *num)
{
	int tmp = 0;
	struct LinkNode *trace = L;

	if(pos <= 0 || pos > get_length(L))
	{
		return 0;
	}

	while(pos-- > 0)
	{
		trace = trace->next;
	}

	tmp = trace->num;
	trace->num = *num;
	*num = tmp;

	return 1;
}

/*
打印链表元素
*/
void print_LinkList(struct LinkNode *L)
{
	struct LinkNode *trace = L->next;
	while(trace != NULL)
	{
		printf("%d ", trace->num);
		trace = trace->next;
	}
	printf("\n");
}

/*
初始化链表
*/
struct LinkNode *init_link_list()
{
	struct LinkNode *tmp_list_node = (struct LinkNode *)malloc(sizeof(struct LinkNode));
	tmp_list_node->next = NULL;
	
	return tmp_list_node;
}

int main(int argc, char *argv[])
{
	int num = 12;

	struct LinkNode *La = NULL;
	La = init_link_list();

	insert_LinkList(La, 7, 0);
	insert_LinkList(La, 8, 0);
	insert_LinkList(La, 9, 0);
	insert_LinkList(La, 6, 1);
	insert_LinkList(La, 5, 3);
	print_LinkList(La);
	delete_LinkList(La, 2);
	print_LinkList(La);
	printf("%d\n",search_LinkList(La, 5));
	update_LinkList(La, 3, &num);
	print_LinkList(La);

	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值