数据结构.单链表

这个代码是关于单链表的建立,插入(尾插、头插,中间任意插入),删除(根据值删除,根据位删除),修改(根据值修改,根据位修改)
查找(根据位置查找,根据值查找)等知识点的综合;
 
#include<stdio.h>
#include <stdlib.h>
#define T 1
#define F -1

typedef int Type;
typedef int Status;

struct Node
{
	Type value;
	struct Node* next;
};

Status init(struct Node** head);  
Status insert_head(struct Node* head, Type value);
Status insert_tail(struct Node* head, Type value);
Status insert_index(struct Node* head, Type value, int index);
Status delete_index(struct Node* head, int index);
Status delete_value(struct Node* head, Type x);
Status update_index(struct Node* head, int index, Type x);
Status update_value(struct Node* head, Type ov, Type nv);
Status query_index(struct Node* head, int index);
Status query_value(struct Node* head, Type value);
int length(struct Node* head);
void print(struct Node* head);
int main()
{
    int ret;
	struct Node* head;
	ret = init(&head);
	if (F == ret)
	{
		return 1;
	}

	int i;
	for (i = 0; i < 10; i++)
	{
		insert_head(head, i);
	}
	for (i = 0; i < 10; i++)
	{
		insert_tail(head, i);
	}
	print(head);
	length(head);
	printf("%d\n", length(head));
	delete_index(head, length(head) - 1);
	delete_index(head, 0);
	delete_index(head, 5);
	print(head);

	insert_index(head, 99, length(head));
	insert_index(head, 99, 0);
	insert_index(head, 99, 5);
	print(head);

	delete_value(head, 4);
	print(head);

	update_index(head, 4, 0);
	print(head);

	update_value(head, 0, 4);
	print(head);

	query_index(head, 6);
	query_index(head, 100);

	query_value(head, 99);
	return 0;
	

}


Status init(struct Node** head)
{
	struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
	if (NULL == newnode)
	{
		return F;
	}
	newnode->next = NULL;
	newnode->value = 0;
	(*head) = newnode;

	return T;
}

Status insert_head(struct Node* head, Type value)
{
	struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
	if (NULL == newnode)
	{
		return F;
	}
	newnode->value = value;
	newnode->next = head->next;
	head->next = newnode;
	return T;
}

Status insert_tail(struct Node* head,Type value)
{
	struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
	if (NULL == newnode)
	{
		return F;
	}

	newnode->value = value;
	newnode->next = NULL;

	while (head->next != NULL)
	{
		head = head->next;
	}
	head->next = newnode;
	return F;

}

Status insert_index(struct Node* head, Type value, int index)
{
	if (index < 0 || index > length(head))
	{
		printf("out of range\n");
	}
	int i;
	for (i = 0; i < index; i++)
	{
		head = head->next;
	}

	struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
	if (NULL == newnode)
	{
		return F;
	}
	newnode->value = value;
	newnode->next = head->next;
	head->next = newnode;
	return F;
}

Status delete_index(struct Node* head, int index)
{
	if (index < 0 || index >= length(head))
	{
		printf("out of range\n");
		return F;
	}
    int i;
	for (i = 0; i < index; i++)
	{
		head = head->next;
	}
		struct Node* temp  =  head->next->next;
		free(head->next);
		head->next = temp;
		return 0;
}


Status delete_value(struct Node* head, Type x)
{
    int i;
	int len = length(head);
	for (i = 0; i < len; i++)  //length(head) 中的head一直在变化 所以需要用一个参数 代替length(head)
	{
		if (head->next->value == x)
		{
			struct Node* temp = head->next->next;
			free(head->next);
			head->next = temp;
		}
		else
		{
			head = head->next;
		}
	}
	return F;
	
}

Status update_index(struct Node* head, int index, Type x)
{
	if (index < 0 || index > length(head))
	{
        printf("out of range\n");
		return F;
	}
	int i;
	for (i = 0; i < index; i++)
	{
        head = head->next;
	}
	head->value = x;
	return T;
}


Status update_value(struct Node* head, Type ov, Type nv)
{
	while (head->next != NULL)
	{
		if (head->next->value == ov)
		{
			head->next->value = nv;
		}
		else
		{
			head = head->next;
		}
	}
}


Status query_index(struct Node* head, int index)
{
	if (index < 0 || index > length(head))
	{
		printf("out of range\n");
		return F;
	}
	int i;
	for (i = 0; i < index; i++)
	{
		head = head->next;
	}
	printf("第%d个数字是%d\n", index, head->value);
}



Status query_value(struct Node* head, Type value)
{
	int i = 0;
	while (head->next != NULL)
	{
		if (head->next->value == value)
		{
			printf("find = %d\n", i);
		}
		i++;
		head = head->next;
	}
	
}

int length(struct Node* head)
{
	int count = 0;
	while (head->next != NULL)
	{
		++count;
		head = head->next;
	}
	return count;
}
void print(struct Node* head)
{
	while (head->next != NULL)
	{
		printf("%d  ", head->next->value);
		head = head->next;
	}
	printf("\n");
}

输出结果:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值