单链表
一、定义链表结点结构体
头文件
#include <stdio.h>
#include <stdlib.h>//提供malloc()原型
#include <string.h>//提供memset()原型
结构体(定义别名方便书写)
typedef struct List_Node{
int data;//数据域
struct List_Node *next;//指针域
}L;
二、创建链表(头结点)
L *create_List()
{
L *head_Node = (L *)malloc(sizeof(L));//动态内存申请
memset(head_Node, 0, sizeof(L));//将原来数据清零
head_Node->next = NULL;
return head_Node;
}
三、创建新结点
L *create_Node(int Data)
{
L *new_Node = (L *)malloc(sizeof(L));//动态内存申请
memset(new_Node, 0, sizeof(L));
new_Node->data = Data;//给数据域赋值
new_Node->next = NULL;
return new_Node;
}
四、头插法插入结点
每个结点的地址应储存在其前一个结点的next成员中。
void top_insert(L *head_Node, L *new_Node)
{
if(head_Node->next != NULL)
new_Node->next = head_Node->next;//新结点的next指向头结点的下一个结点
head_Node->next = new_Node;//头结点的next指向新结点
}
五、尾插法插入结点
void tail_insert(L *head_Node, L *new_Node)
{
while(head_Node->next != NULL){
head_Node = head_Node->next;//找到链表中的最后一个结点
}
head_Node->next = new_Node;//最后一个结点的next指向新结点
}
六、删除结点
int delete_Node(L *head_Node, int Data)
{
L *current = head_Node;
L *prev = NULL;
while(current->next != NULL){
prev = current;
current = current->next;
if(current->data == Data)//找到要删除的结点了!
{
prev->next = current->next;
free(current);
return 0;
}
}
printf("没有找到要删除的结点!\n");
return -1;
}
七、打印链表
void print_List(L *head_Node)//从第二个结点开始打印
{
while(head_Node->next != NULL){
head_Node = head_Node->next;
printf("%d ", head_Node->data);
}
printf("\n");
}
加入主函数测试
#include <stdio.h>
#include <stdlib.h>//提供malloc()原型
#include <string.h>//提供memset()原型
typedef struct List_Node{
int data;//数据域
struct List_Node *next;//指针域
}L;
//创建链表
L *create_List()
{
L *head_Node = (L *)malloc(sizeof(L));
memset(head_Node, 0, sizeof(L));
head_Node->next = NULL;
return head_Node;
}
//创建链表结点
L *create_Node(int Data)
{
L *new_Node = (L *)malloc(sizeof(L));
memset(new_Node, 0, sizeof(L));
new_Node->data = Data;
new_Node->next = NULL;
return new_Node;
}
//头插法
void top_insert(L *head_Node, L *new_Node)
{
if(head_Node->next != NULL)
new_Node->next = head_Node->next;
head_Node->next = new_Node;
}
//尾插法
void tail_insert(L *head_Node, L *new_Node)
{
while(head_Node->next != NULL){
head_Node = head_Node->next;//找到链表中的最后一个结点
}
head_Node->next = new_Node;
}
//打印链表
void print_List(L *head_Node)
{
while(head_Node->next != NULL){
head_Node = head_Node->next;
printf("%d ", head_Node->data);
}
printf("\n");
}
//删除结点
int delete_Node(L *head_Node, int Data)
{
L *current = head_Node;
L *prev = NULL;
while(current->next != NULL){
prev = current;
current = current->next;
if(current->data == Data){
prev->next = current->next;
free(current);
return 0;
}
}
printf("没有找到要删除的结点!\n");
return -1;
}
int main()
{
L *list = create_List();
top_insert(list, create_Node(10));
top_insert(list, create_Node(20));
top_insert(list, create_Node(30));
tail_insert(list, create_Node(10));
tail_insert(list, create_Node(20));
tail_insert(list, create_Node(30));
delete_Node(list, 30);
delete_Node(list, 30);
print_List(list);
free(list);
return 0;
}