//定义数据类型
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语言实现的单向有头链表的基本操作,欢迎大家参考学习哦!点赞关注基诺将会有意想不到的惊喜哦。