1、实现代码
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define MaxSize 10
#define true 1
#define false 0
typedef int bool;
//定义单链表节点
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode ,*LinkList;
LNode* Create_Header() {
LNode * node = (LNode*)malloc(sizeof(LNode));
node->next = NULL;
if (node != NULL) {
return node;
}
return NULL;
}
//头插法建立单链表
void Add_Node_Head(LNode* header,ElemType data) {
LNode* node = (LNode*)malloc(sizeof(LNode));
node->data = data;
node->next = header->next;
header->next = node;
}
//尾插法建立
void Add_Node_Tail(LNode* header, ElemType data) {
LNode* node = (LNode*)malloc(sizeof(LNode));
node->data = data;
node->next = NULL;
LNode* p = header;
while (p) {
if (NULL == p->next) {
p->next = node;
return;
}
p = p->next;
}
free(p);
}
//链表打印
void Print_LinkList(LNode *header) {
if (Is_Empty(header)) {
printf("链表为空");
return;
}
LNode* p = header->next;
int n = 0;
while (p) {
if (n % 10 == 0 && n / 10 != 0) {
printf("\n");
}
printf("%d ", p->data);
p = p->next;
}
free(p);
}
//判断是否为空
bool Is_Empty(LNode * header) {
if (header->next == NULL) {
return true;
}
return false;
}
LNode* Get_Node(LNode* header,ElemType data) {
if (Is_Empty(header)) {
return NULL;
}
LNode* p = header->next;
while (p) {
if (data == p->data) {
return p;
}
p = p->next;
}
free(p);
return NULL;
}
//在指定节点后插入
bool Af_Insert_Node(LNode* header, ElemType preData, ElemType data) {
if (Is_Empty(header)) {
printf("链表为空,无法插入");
return false;
}
LNode* p = header->next;
while (p) {
if (preData == p->data) {
LNode* node = (LNode*)malloc(sizeof(LNode));
node->data = data;
node->next = p->next;
p->next = node;
return true;
}
p = p->next;
}
free(p);
return false;
}
//在指定节点前插入
bool Pre_Insert_Node(LNode* header, ElemType preData, ElemType data) {
if (Is_Empty(header)) {
printf("链表为空,无法插入");
return false;
}
if (preData==header->next->data ) {
LNode* node = (LNode*)malloc(sizeof(LNode));
node->data = data;
node->next = header->next;
header->next = node;
return true;
}
LNode* p = header->next;
while (p) {
if (p->next!=NULL&&preData == p->next->data) {
LNode* node = (LNode*)malloc(sizeof(LNode));
node->data = data;
node->next = p->next;
p->next = node;
return true;
}
p = p->next;
}
free(p);
return false;
}
//修改节点
bool Modify_Node(LNode* header ,ElemType oldData,ElemType newData) {
if (Is_Empty(header)) {
return false;
}
LNode* p = header;
while (p) {
if (oldData == p->data) {
p->data = newData;
return true;
}
p = p->next;
}
return false;
}
//删除节点
bool Delete_Node(LNode* header,ElemType data) {
if (Is_Empty(header)) {
return false;
}
LNode* p = header;
if (data==header->next->data) {
header->next = header->next->next;
return true;
}
while (p) {
if (p->next!=NULL&&data == p->next->data) {
if (p->next->next == NULL) {
p->next = NULL;
return true;
}
p->next = p->next->next;
return true;
}
p = p->next;
}
free(p);
return false;
}
int main() {
LNode* header= Create_Header();
for (int i = 0; i < 10; i++){
//Add_Node_Head(header, i);
Add_Node_Tail(header, i);
}
Print_LinkList(header);
printf("\n");
printf("%d", Get_Node(header, 3)->data);
printf("\n");
Modify_Node(header, 3, 99);
Print_LinkList(header);
printf("\n");
Pre_Insert_Node(header, 9, 123);
Print_LinkList(header);
printf("\n");
Af_Insert_Node(header, 9, 456);
Print_LinkList(header);
printf("\n");
Delete_Node(header, 0);
Print_LinkList(header);
printf("\n");
Delete_Node(header, 123);
Print_LinkList(header);
printf("\n");
Delete_Node(header, 456);
Print_LinkList(header);
return 0;
}