数据结构 / day04 作业

1. 单链表任意位置删除, 单链表任意位置修改, 单链表任意位置查找, 单链表任意元素查找, 单链表任意元素修改, 单链表任意元素删除, 单链表逆置

cpp 复制代码
// main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	Linklist head=NULL; //head 是头指针
	// printf("head=%p\n", head);
	// printf("head->data=%d\n", head->data);
	// printf("head->next=%p\n", head->next);

	int n;
	int pos;
	int key;
	data_type element;
	printf("please input n:");
	scanf("%d", &n);

	for(int i=0; i<n; i++)
	{
		printf("please input No.%d element: ", i+1);
		scanf("%d", &element);
		head=insert_head(element, head);
	
	}

	puts("---ouput Linklist---");
	output(head);
	

/*
	puts("---get tail node---");
	Linklist node_tail = get_tail_node(head);
	printf("tail->data=%d\n", node_tail->data);

	puts("---append element---");
	printf("please input element to append:");
	scanf("%d", &element);
	head=append(head, element);
	output(head);


	puts("---delete first node---");
	head=delete_first(head);
	head=delete_first(head);
	output(head);

	
	puts("---delete tail node---");
	head=delete_tail(head);
	head=delete_tail(head);
	output(head);

	puts("---get list len---");
	int len=get_len(head);
	printf("len=%d\n", len);

	puts("---insert_by_pos---");
	int pos;
	printf("please input pos: ");
	scanf("%d", &pos);
	printf("please input element: ");
	scanf("%d", &element);
	head=insert_by_pos(head, pos, element);
	output(head);

	puts("---get node by pos---");
	printf("please input pos:");
	scanf("%d", &pos);
	Linklist node  = get_node_by_pos(head, pos);
	printf("node->data=%d\n", node->data);

*/
	puts("---delete node by pos---");
	printf("please input pos:");
	scanf("%d", &pos);
	head = delete_by_pos(head, pos);
	output(head);

	puts("---update node by pos---");
	printf("please input pos:");
	scanf("%d", &pos);
	printf("please element:");
	scanf("%d", &element);
	int ret = update_by_pos(head, pos, element);
	output(head);


	puts("---get node by element---");
	printf("please element:");
	scanf("%d", &element);
	pos = get_node_by_element(head, element);
	printf("pos=%d\n",pos);
//
	puts("---update node by element---");
	printf("please input a key:");
	scanf("%d", &key);
	printf("please input an element:");
	scanf("%d", &element);
	ret = update_node_by_element(head, key, element);
	output(head);
//
	puts("---delete by element---");
	printf("please input element:");
	scanf("%d", &element);
	head = delete_node_by_element(head, element);
	output(head);

	//
	puts("---reverse list---");
	head = revser_list(head);
	output(head);
//


	return 0;
}
cpp 复制代码
//head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

typedef int data_type;

typedef struct Node
{
	int data;
	struct Node *next;

}*Linklist;

Linklist create();

typedef struct Node node;

Linklist create_node();
Linklist insert_head(data_type data, Linklist head);
int output(Linklist head);
Linklist append(Linklist head, data_type element);
Linklist get_tail_node(Linklist head);
Linklist delete_first(Linklist head);
Linklist free_node(Linklist node);
Linklist delete_tail(Linklist head);
int get_len(Linklist head);
Linklist insert_by_pos(Linklist head, int pos, data_type element);
Linklist delete_by_pos(Linklist head, int pos);
Linklist get_node_by_pos(Linklist head, int pos);
int update_by_pos(Linklist head, int pos, data_type element);
int get_node_by_element(Linklist head, data_type key);
Linklist delete_node_by_element(Linklist head, data_type key);
Linklist revser_list(Linklist head);
int update_node_by_element(Linklist head, data_type key, data_type element);
#endif
cpp 复制代码
//test.c

#include "head.h"

Linklist create_node()
{
	Linklist node=(Linklist)malloc(sizeof(struct Node));
	if(NULL==node)
	{
		return NULL;

	}
	//success
	node->data=0;
	node->next=NULL;

	return node;
}

Linklist insert_head(data_type element, Linklist head)
{
	//创建新节点
	Linklist node = create_node();
	if(NULL==node){
		return head;
	}
	node->data=element;

	//判断链表是否位空
	if(NULL==head)
	{
		head=node;

	}
	else //链表不为空
	{
		node->next=head;
		head=node;		
	}
	return head;// 这里的head是形参,所以需要返回用以改变主函数的head
}


int output(Linklist head)
{
	if(NULL==head)
	{
		return -1;
	}

	Linklist node = head;

	while(node!=NULL)
	{
		//printf("data=%d, next=%p\t", node->data, node->next);
		printf("%d\t", node->data);
		node=node->next;

	}
	putchar(10);

}

Linklist get_tail_node(Linklist head)
{

	Linklist node=head;
	while(node->next!=NULL && node!=NULL)
	{
		node=node->next;

	}
	return node;


}


Linklist append(Linklist head, data_type element)
{
	//
	Linklist node = create_node();
	if(NULL==node)
	{
		return head;
	}
	node->data=element;
	node->next=NULL;

	Linklist node_tail=get_tail_node(head);
	if(NULL==node_tail)
	{
		head = node;
	}

	node_tail->next = node;	

	return	head;

}

Linklist free_node(Linklist node)
{
	free(node);
	node=NULL;
	return node;

}


Linklist delete_first(Linklist head)
{
	if(NULL==head)
	{
		return head;
	}

	Linklist node_deleted = head;

	head=head->next;

	node_deleted = free_node(node_deleted);

	return head;

}

Linklist delete_tail(Linklist head)
{
	if(NULL==head)
	{
		return head;
	}

	//找到 tail 之前的node
	Linklist node = head;
	if(node->next==NULL)
	{
		head=free_node(node);
		return head;
	}
	while(NULL!=node->next->next)
	{
		node=node->next;
	}

	node->next=free_node(node->next);
	node->next=NULL;
	return head;
}

int get_len(Linklist head)
{
	//puts("in get_len");
	int count=0;
	Linklist node=head;
	while(node!=NULL)
	{
		//printf("len=%d\n", len);
		count++;
		node=node->next;
	}
	return count;

}

Linklist insert_by_pos(Linklist head, int pos, data_type element)
{
	//pos, Linklist pos start from 1 hear
	int len=get_len(head);
	if(pos<1 || pos>len+1)
	{
		return head;

	}

	if(NULL==head || pos==1)
		head=insert_head(element, head);

	else
	{
		//find node at pos
		Linklist node=head;
		for(int i=1; i<pos-1; i++)
		{
			node=node->next;
		}
		printf("node(pos-1)->data=%d", node->data);

		//create new node
		Linklist node_new= create_node();
		if(NULL==node_new)
		{
			return head;
		}
		node_new->data=element;

		//insert 
		node_new->next=node->next;
		node->next=node_new;
	}
	return head;
}


Linklist get_node_by_pos(Linklist head,int pos)
{
	if(NULL==head)
	{
		return head;
	}

	int len=get_len(head);
	if(pos<1||pos>len)
	{
		return NULL;
	}

	Linklist node=head;
	int count=1;

	while(count<pos)
	{
		count++;
		node=node->next;
	}

	return node;

}

Linklist delete_by_pos(Linklist head,int pos)
{
	//note: list pos start from 1

	if(NULL==head)
	{
		return head;
	}

	//判断pos合法
	int len=get_len(head);
	if(pos<1 && pos>len) 
	{
		return head;
	}

	if(1==len || 1==pos)
	{
		head=delete_first(head);
	}
	else
	{
		Linklist node = get_node_by_pos(head, pos-1);
		//delete
		Linklist node_tbd = node->next;
		node->next=node->next->next;
		free_node(node_tbd);
		node_tbd=NULL;
	}
	return head;

}


int update_by_pos(Linklist head, int pos, data_type element)
{
	if(NULL==head)
	{
		return -1;
	}

	Linklist node = get_node_by_pos(head, pos);
	if(NULL==node)
		return -1;

	node->data=element;

	return 0;

}

int get_node_by_element(Linklist head, data_type key)
{
	//找到返回pos信息

	if(NULL==head)
	{
		return -1;
	}

	int count=0;
	int is_found=0;
	Linklist node=head;


	while(NULL!=node)
	{
		//printf("node->data=%d\n", node->data);
		count++;
		if(node->data==key)
		{
			is_found=1;
			break;
		}

		node=node->next;

	}

	if(is_found==1)
	{
		return count;
	}
	else
	{
		return -1;
	}
}


Linklist delete_node_by_element(Linklist head, data_type key)
{
	if(NULL==head)
	{
		return head;
	}

	int pos = get_node_by_element(head, key);
	if(-1==pos)
	{
		return head;
	}

	head=delete_by_pos(head, pos);
	return head;

}

Linklist revser_list(Linklist head)
{
	if(NULL==head||NULL==head->next)
	{
		return head;
	}

	Linklist node=head->next;

		head->next=NULL;

	while(NULL!=node)
	{
		Linklist node_t=node;
		node=node->next;

		node_t->next=head;
		head=node_t;
	}
	return head;
}


int update_node_by_element(Linklist head, data_type key, data_type element)
{
	if(NULL==head)
	{
		return -1;
	}

	int pos=get_node_by_element(head, key);
	if(-1==pos)
	{
		return -1;
	}

	int ret=update_by_pos(head, pos, element);
	return ret;

}

运行结果

cpp 复制代码
please input n:7
please input No.1 element: 1
please input No.2 element: 2
please input No.3 element: 3
please input No.4 element: 4
please input No.5 element: 5
please input No.6 element: 6
please input No.7 element: 7
---ouput Linklist---
7	6	5	4	3	2	1	
---delete node by pos---
please input pos:1
6	5	4	3	2	1	
---update node by pos---
please input pos:2
please element:500
6	500	4	3	2	1	
---get node by element---
please element:4
pos=3
---update node by element---
please input a key:4
please input an element:400
6	500	400	3	2	1	
---delete by element---
please input element:2
6	500	400	3	1	
---reverse list---
1	3	400	500	6	

2.思维导图

相关推荐
盼海1 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
内核程序员kevin3 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
网易独家音乐人Mike Zhou4 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
搬砖的小码农_Sky7 小时前
C语言:数组
c语言·数据结构
朝九晚五ฺ7 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream7 小时前
Linux的桌面
linux
xiaozhiwise8 小时前
Makefile 之 自动化变量
linux
先鱼鲨生9 小时前
数据结构——栈、队列
数据结构
一念之坤9 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python