单向有头链表的基本操作(C语言版)

//定义数据类型 
typedef int DataType;

//定义结点结构体
typedef struct _Node{
	DataType data;
	struct _Node* next;
}Node; 

创建链表 

Node* CreateList(){
	Node* list = (Node*)calloc(1,sizeof(Node));
	assert(list);
	list->next = NULL; 
	return list;
} 

创建结点

// 创建结点
Node* CreateNode(DataType data){
	Node* newNode = (Node*)calloc(1,sizeof(Node));
	assert(newNode);
	newNode->data = data; 
	return newNode; 
} 

遍历链表

//遍历链表
void TravelList(Node* list){
	Node* curNode = list->next;
	if(curNode == NULL){
		printf("链表为空!\n");
		return; 
	}
	while(curNode != NULL){
		printf("%d ",curNode->data);
		curNode = curNode->next; 
	}
	printf("\n");
} 

头部插入

//头部插入
void InsertFront(Node* list,DataType data){
	Node* insertNode = CreateNode(data);
	assert(insertNode);
	if(list->next == NULL){
		list->next = insertNode;
		insertNode->next = NULL;
	}
	else{
		Node* nextNode = list->next;
		insertNode->next = nextNode;
		list->next = insertNode;
	}
} 

尾部插入

//尾部插入
void InsertBack(Node* list,DataType data){
	Node* preNode = list;
	Node* nextNode = preNode->next;
	while(nextNode != NULL){
		preNode = nextNode;
		nextNode = preNode->next;
	}
	Node* insertNode = CreateNode(data);
	assert(insertNode);
	preNode->next = insertNode;
	insertNode->next = NULL;
} 

指定位置插入

//指定位置插入
void InsertByPos(Node* list,DataType data,int pos){
	Node* curNode = list;
	int index = 0;
	while(curNode->next != NULL && index < pos - 1){
		curNode = curNode->next;
		index++; 
	}
	
	if(curNode->next == NULL){
		if(index == pos - 1){
			Node* insertNode = CreateNode(data);
			curNode->next = insertNode;
			insertNode->next = NULL; 
		}else{
			printf("所选位置超出链表长度!\n");
		}
	}else{
		Node* insertNode = CreateNode(data);
		Node* nextNode = curNode->next;
		insertNode->next = nextNode;
		curNode->next = insertNode;
	} 
	
}

指定值插入(前方)

//指定值插入(前方)
void InsertByValue(Node* list,DataType data,DataType posData){
	if(list->next == NULL){
		printf("链表为空!\n"); 
		return; 
	}
	Node* preNode = list;
	Node* nextNode = preNode->next;
	while(nextNode != NULL && nextNode->data != posData){
		preNode = preNode->next;
		nextNode = nextNode->next; 
	} 
	if(nextNode == NULL){
		printf("没有找到指定元素!\n");
	}else{
		Node* insertNode = CreateNode(data);
		insertNode->next = nextNode;
		preNode->next = insertNode;
	}
} 

头部删除

// 头部删除
void PopFront(Node* list){
	if(list->next == NULL){
		printf("链表为空!\n"); 
		return; 
	}
	
	Node* delNode = list->next;
	
	if(delNode->next == NULL){
		list->next = NULL;
		free(delNode);
		delNode = NULL; 
	}else{
		Node* nextNode = delNode->next;
		list->next = nextNode;
		free(delNode);
		delNode = NULL;
	} 
} 

尾部删除

// 尾部删除
void PopBack(Node* list){
	if(list->next == NULL){
		printf("链表为空!\n"); 
		return; 
	}
	Node* preNode = list;
	Node* nextNode = preNode->next;
	
	while(nextNode->next != NULL){
		preNode = preNode->next;
		nextNode = nextNode->next; 
	}
	
	preNode->next = NULL;
	free(nextNode);
	nextNode = NULL; 
} 

指定位置删除

//指定位置删除
void PopByPos(Node* list,int pos){
	if(list->next == NULL){
		printf("链表为空!\n"); 
		return; 
	}
	Node* preNode = list;
	Node* nextNode = preNode->next;
	int i=1;
	while(nextNode != NULL && i < pos){
		preNode = preNode->next;
		nextNode = nextNode->next; 
		i++;
	}
	if(i == pos){
		if(nextNode->next == NULL){
			preNode->next = NULL;
			free(nextNode);
			nextNode = NULL; 
		}else{
			preNode->next = nextNode->next;
			free(nextNode);
			nextNode = NULL;
		}
	}else{
		printf("超出指定位置范围!\n"); 
	} 
} 

指定值删除

// 指定值删除
void PopByValue(Node* list,DataType posData){
	if(list->next == NULL){
		printf("链表为空!\n"); 
		return; 
	}
	Node* preNode = list;
	Node* nextNode = preNode->next;
	while(nextNode != NULL && nextNode->data != posData){
		preNode = preNode->next;
		nextNode = nextNode->next; 
	}
	if(nextNode == NULL){
		printf("未找到指定元素!\n"); 
	}
	else if(nextNode->data == posData){
		if(nextNode->next == NULL){
			preNode->next = NULL;
			free(nextNode);
			nextNode = NULL; 
		}else{
			preNode->next = nextNode->next;
			free(nextNode);
			nextNode = NULL;
		}
	}
} 

查找指定元素

// 查找指定元素 
void FindValue(Node* list,DataType value){
	if(list->next == NULL){
		printf("链表为空!\n"); 
		return; 
	}
	Node* curNode = list->next;
	int pos = 1;
	while(curNode != NULL && curNode->data != value){
		curNode = curNode->next;
		pos++;
	}
	if(curNode == NULL){
		printf("未找到指定元素!\n");
	}else if(curNode->data == value){
		printf("指定元素的位置为:%d\n",pos); 
	}
} 

销毁链表

// 销毁链表
void DeleteList(Node* list){
	while(list->next != NULL){
		PopBack(list); 
	}
	free(list);
	list = NULL; 
	printf("链表销毁成功!\n"); 
} 

        以上便是用C语言实现的单向有头链表的基本操作,欢迎大家参考学习哦!点赞关注基诺将会有意想不到的惊喜哦。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值