首先需要两个头文件#include <stdio.h>和#include <stdlib.h>
1、定义链表结构体
typedef struct Node//定义链表结构体
{
int data;//数据域
struct Node *next;//指针域
}Node;
2、初始化头节点
Node *iniList()
{
Node *list = (Node*)malloc(sizeof(Node));//创建一个空指针域
list->data = 0;//该指针的data置为0
list->next = NULL;//该指针指向空
return list;//返回该链表(head指针)
}
3、头插法创建单链表
void headList(Node *list,int data)
{
Node *node = (Node*)malloc(sizeof(Node));//开辟空间
node->data = data;//向新建的指针data域中写入数据
node->next = list->next;//新建的指针指向头节点的下一个节点
list->next = node;//头节点指向新建的节点
list->data++;//头节点中的data域数字加一代表链表插入一个元素
}
4、尾插法创建单链表
void tailList(Node *list,int data)
{
Node *node = (Node *)malloc(sizeof(Node));//同上
Node *head = list;//保存头节点
node->data = data;//将数据写入新建的节点的data域中
node->next = NULL;//因为是尾插法所以新建的节点必定是最后节点,指向空
list = list->next;//第一个节点是头节点,所以list要向后走一步
while(list->next)//判断节点是否为空,不为空就一直往后走直到最后一个节点
list = list->next;
list->next = node;//新建节点链接在最后一个节点后面
head->data++;//同上
}
5、删除节点
void deleteList(Node *list,int data)
{
Node *current = list->next;//删除一个节点需要当前节点的指针
Node *pre = list;//删除一个节点也需要前一个节点的指针
current = current->next;//头节点的下一个节点才是第一个节点
while(current->next!=NULL)//循环遍历所有节点
{
if(current->data==data)//找到符合节点的data域数据则进入循环
{/*要删除当前节点首先需要前一个节点指向当前节点的下一个节点,
也就是前一个节点跨过当前节点指向下下一个节点*/
pre->next = current->next;
free(current);//链接后,释放当前节点
list->data--;//头指针data域减一
break;//退出循环
}
else/*没有找到符合条件的节点,
则当前节点指针赋值给上一个节点指针,
当前节点指向下一个节点(也就是两个节点同时往后移动一个位置)*/
{
pre = current;
current = current->next;
}
}
}
6、遍历输出
void printList(Node *list)
{
list = list->next;//头节点的下一个节点才是第一个节点
while(list)//循环条件list不为空
{
printf("%d ",list->data);//输出list指向的data域
list = list->next;//指针往后走
}
printf("\n");
}
7、主函数测试各个模块
int main()
{
int i;
Node *list = iniList();//初始化头节点
for(i=1;i<=5;i++)
headList(list,i);//验证头插法函数
for(i=6;i<=10;i++)
tailList(list,i);//验证尾插法函数
printList(list);//验证遍历输出函数
return 0;
}