#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<stdio.h>
#include <string.h>
#include<stdlib.h>
/*
1.创建结构体
2.创建新的节点
3.创建链表
4.更新节点
5.插入新的节点
6.删除节点
7.销毁
8.显示
*/
//1.创建结构体
typedef int data_Type;
typedef struct Node
{
data_Type data;//数据域
struct Node* next;//下一个节点
}Node;
//2.创建新的节点
Node* Create_newNode(data_Type data)//创建新的节点需要传入数据
{
//为节点申请空间
Node* pnew = malloc(sizeof(*pnew));
//判断是否申请成功
if (pnew == NULL)
return NULL;
pnew->data = data;//把输入的数据赋值到创建的节点的data里面
pnew->next = NULL;//节点的next 为空
//创建完则返回pnew
return pnew;
}
//3.创建链表
Node* Create_list()
{
Node* head = NULL;//创建的新的链表则需要给他的头赋值为空
Node* tail = NULL;//跟头节点一样都需要赋值为空因为这是一个新的链表里面没有任何数据
//下面则需要插入数据
while (1)
{
data_Type data;
if (scanf("%d", &data) == 0)//如果输入的数据不是整形则会退出整个while
break;
//创建新的节点
Node* pnew = Create_newNode(data);
if (pnew == NULL)//判断有没有创建成功
return NULL;
if (head == NULL)//判断head里面有没有数据 没有则就把刚刚创建的赋值给它
{
head = pnew;
tail = pnew;
}
else
{
#if 1
//尾插法
tail->next = pnew;//他的尾指将会等于传入的节点
tail = pnew;//更新节点
#else
//头插法
pnew->next = head;//head将会赋值给新建元素的next
head = pnew;
#endif
}
}
return head;
}
//4.更新节点
//传入新的节点和旧的节点
Node* Update_node(Node* head, data_Type oldData, data_Type newData)
{
if (head == NULL)
return NULL;
Node* p = head;//p将是用来找元素的
while (p)
{
if (p->data = oldData)//找到则替换
p->data = newData;
else
p = p->next;//没有找到将继续找
}
return head;
}
//5.插入新的节点
Node* Insert_Node(Node* head, data_Type srcData, data_Type newData)
{
//创建一个新的节点为了方便插入
Node* pnew = Create_newNode(newData);
if (pnew == NULL)
return NULL;
Node* p = head;//遍历节点
Node* pre = head;//遍历p的前一个节点
while (p)
{
if (p->data == srcData)//找到要插入的地方
break;
else
{
pre = p;//更新p的前一个节点
p = p->next;//p将指向他的下一个节点
}
}
if (p)
{
pre->next = pre;//要是在最后直接插入
}
else if (head->data == srcData)//要是在第一个头插
{
pnew->next = head;
head = pnew;
}
else
{
pnew->next = p;//中间插入
pre->next = pnew;
}
return head;
}
//6.删除节点
Node* Delete_node(Node* head, data_Type data)
{
Node* p = head;//记录要删除的节点
Node* pre = head;//p的前驱
while (p)
{
if (p->data == data)//找到了
break;
else
{
pre = p;
p = p->next;
}
}
if (p)
{
printf("没有要删除的节点\n");
return head;
}
else if (p->data == head->data)//删除头
{
head = p->next;
p->next = NULL;
free(p);
}
else if (p->next == NULL && p->data == data)
{
pre->next == NULL;
free(p);
}
else//删除中间
{
pre->next = p->next;
p->next = NULL;
free(p);
}
return head;
}
//7.销毁
void destroy_list(Node* head)
{
if (head == NULL)
return ;
Node* temp = NULL;
Node* p = head;
while (p)
{
temp = p->next;
p->next = NULL;
free(p);
p = temp;
}
head = NULL;
}
//8.显示
void show_Node(Node* head)
{
if (head == NULL)
return;
Node* p = head;
while (p)
{
printf(" %d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
// 创建新表
struct node* head = Create_list();
if (head == NULL)
{
printf("create list failed:\n");
return -1;
}
// 修改节点
//head = update_node(head,3,8);
// 在3前面插入8
//head = insert_node(head,3,8);
// 删除节点
head = Delete_node(head, 3);
// 显示表
show_Node(head);
// 销毁链表
destroy_list(head);
return 0;
}