单链表的插入和删除
#include "stdafx.h"
#include <stdlib.h>
struct Node //建立一个结构体
{
int value;
struct Node *next;
};
void insertNode(struct Node **head, int value)
{
struct Node *previous;
struct Node *current;
struct Node *ne;
current = *head;
previous = NULL;
while (current != NULL && current->value < value){ //遍历链表,找到插入点.
//current != NULL 表示的是当current遍历到最后的节点或者为空链表
//current->value < value 表示的是当current大于value的值时,也就是找到value指向的节点
previous = current; //当找到current的值时,则previous则是指向vaule的节点
current = current->next;
}
ne = (struct Node *)malloc(sizeof(struct Node)); //申请堆空间
if (ne == NULL){
printf("内存分配失败!");
exit(1);
}
ne->value = value; //将值赋到ne的信息域中
ne->next = current; //新节点指向current
if (previous == NULL){ //判断previous是否为NULL,若为NULL则代表是空链表
*head = ne; //若为空链表则只要把头指针指向新插入的节点,即可
}
else{
previous->next = ne; //若不是则将前一节点指向新插入的节点
}
}
void deleteNode(struct Node **head, int value) //其实和增加一个节点差不多,只不过要改些地方
{
struct Node *current, *previous;
current = *head;
previous = NULL;
while (current != NULL && current->value != value){ //current->value != value指的是当current等于value时跳出循环
previous = current;
current = current->next;
}
if (current == NULL){ //若没找到
printf("找不到匹配的节点!\n");
return ;
}
else{
if (previous == NULL){ //若current是一个空链表
*head = current->next; //头指针指向current
}
else{
previous->next = current->next; //若不是,则将前一节点的指向current的后一节点地址
}
}
free(current); //释放current
}
void printNode(struct Node *head) //循环打印链表
{
struct Node *current;
current = head;
while (current != NULL){
printf("%d", current->value);
current = current->next;
}
putchar('\n');
}
int _tmain(int argc, _TCHAR* argv[])
{
struct Node *head = NULL;
int input;
while (1)
{
printf_s("请输入一个整数 (输入-1表示结束:)");
scanf_s("%d", &input);
if (input == -1)
{
break;
}
insertNode(&head, input);
printNode(head);
}
printf("开始测试删除整数...\n");
while (1)
{
printf_s("请输入一个整数 (输入-1表示结束:)");
scanf_s("%d", &input);
if (input == -1)
{
break;
}
deleteNode(&head, input);
printNode(head);
}
return 0;
}