myList.h头文件
#pragma once
//单链表的实现(C语言)
#define SUCCESS -1
#define ERROR 0
#define STATUS int
typedef struct node
{
int data;
struct node* next;
}NODE_T;
//创建链表头节点
NODE_T* createHead();
//头部添加节点
STATUS addToHead(NODE_T* head, NODE_T *newNode);
//尾部添加节点
STATUS addToTail(NODE_T* head, NODE_T *newNode);
//指定位置添加节点
STATUS addSpecify(NODE_T* head, NODE_T *newNode, int i);
//删除指定位置的元素
STATUS delSpecify(NODE_T* head, int i);
//删除指定元素
STATUS delElem(NODE_T* head, int data);
//查找指定位置元素
STATUS searchSpecify(NODE_T* head, int i, int *data);
//查找元素在链表中的位置
STATUS searchPosition(NODE_T* head, int data);
//获取链表长度
STATUS getLength(NODE_T *head);
//清空链表
STATUS clearList(NODE_T *head);
//销毁链表
STATUS destroyList(NODE_T *head);
//遍历链表
void showList(NODE_T *head);
myList.cpp
```c
#include "myList.h"
#include <stdlib.h>
#include <stdio.h>
//创建链表头节点
NODE_T* createHead()
{
NODE_T* head = (NODE_T*)malloc(sizeof(NODE_T));
if (!head)
return ERROR;
head->data = 0;
head->next = NULL;
return head;
}
//头部添加节点
STATUS addToHead(NODE_T* head, NODE_T* newNode)
{
head->data += 1;
if (head->next) /*链表不为空*/
{
newNode->next = head->next;
head->next = newNode;
}
else { /*链表为空*/
head->next = newNode;
newNode->next = NULL;
}
return SUCCESS;
}
//尾部添加节点
STATUS addToTail(NODE_T* head, NODE_T* newNode)
{
head->data += 1;
NODE_T* tmp = head;
while (tmp->next) /*单链表里常用的遍历方法*/
{
tmp = tmp->next;
}
tmp->next = newNode;
newNode->next = NULL;
return SUCCESS;
}
//指定位置添加节点
STATUS addSpecify(NODE_T* head, NODE_T* newNode, int i)
{
if (i<0 || i>head->data)
{
printf("插入位置出错\n");
return ERROR;
}
head->data += 1;
NODE_T* tmp = head;
int count = 0;
while (tmp->next)
{
tmp = tmp->next;
++count;
if (count == i)
break;
}
newNode->next = tmp->next; /*添加新的节点*/
tmp->next = newNode;
return SUCCESS;
}
//删除指定位置的元素
STATUS delSpecify(NODE_T* head, int i)
{
if (i<0 || i>head->data)
return ERROR;
NODE_T* tmp = head;
int count = 0;
while (tmp->next)
{
tmp = tmp->next;
++count;
if ((count+1) == i)
break;
}
printf("被删除的元素:%d\n", tmp->next->data);
tmp->next = tmp->next->next; /*删除节点*/
free(tmp->next);
return SUCCESS;
}
//删除指定元素
STATUS delElem(NODE_T* head, int data)
{
head->data -= 1;
NODE_T* tmp = head;
while (tmp->next)
{
tmp = tmp->next;
if (tmp->next->data == data)
{
printf("被删除的元素:%d\n", tmp->next->data);
tmp->next = tmp->next->next;
free(tmp->next);
break;
}
}
return SUCCESS;
}
//查找指定位置元素
STATUS searchSpecify(NODE_T* head, int i, int* data)
{
if (i<0 || i>head->data)
return ERROR;
NODE_T* tmp = head;
int count = 0;
while (tmp->next)
{
tmp = tmp->next;
++count;
if (count == i)
{
printf("第%d个元素是:%d\n", i, tmp->data);
*data = tmp->data;
break;
}
}
return 0;
}
//查找元素在链表中的位置
STATUS searchPosition(NODE_T* head, int data)
{
NODE_T* tmp = head;
int count = 0;
while (tmp->next)
{
tmp = tmp->next;
++count;
if (tmp->data == data)
{
printf("%d在链表里的位置:%d\n", data, count);
return count;
}
}
return ERROR;
}
//获取链表长度
STATUS getLength(NODE_T* head)
{
return head->data;
}
//清空链表
STATUS clearList(NODE_T* head)
{
NODE_T* tmp1 = head, *tmp2; /*一个指向当前要删除的节点,另一个指向删除节点的下一个节点*/
while (tmp1->next)
{
tmp1 = tmp1->next;
tmp2 = tmp1->next->next;
free(tmp1);
tmp1 = tmp2;
}
return SUCCESS;
}
//销毁链表
STATUS destroyList(NODE_T* head)
{
clearList(head);
free(head);
return 0;
}
//遍历链表
void showList(NODE_T* head)
{
NODE_T* tmp = head;
int count = 0;
while (tmp->next)
{
tmp = tmp->next;
++count;
printf("链表第%d个元素是%d\n", count,tmp->data);
}
}
测试main.cpp:
//main.cpp
#include "myList.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
NODE_T* head = createHead(); /*得到链表头节点*/
NODE_T* node1 = (NODE_T*)malloc(sizeof(NODE_T));
if (!node1)
return -1;
node1->data = 10;
addToHead(head,node1); /*链表头部添加一个节点*/
NODE_T* node2 = (NODE_T*)malloc(sizeof(NODE_T));
if (!node2)
return -1;
node2->data = 20;
addSpecify(head, node2,1); /*链表指定位置添加一个节点*/
NODE_T* node3 = (NODE_T*)malloc(sizeof(NODE_T));
if (!node3)
return -1;
node3->data = 30;
addSpecify(head, node3, 2); /*链表指定位置添加一个节点*/
showList(head); /*遍历链表*/
int data = 0;
searchSpecify(head, 3, &data); /*查找链表里第三个元素的值*/
searchPosition(head, 10); /*查找数据10在链表里的位置*/
return 0;
}
结果: