单向链表的增删改查详解
什么是链表?
链表是结构体变量和结构体变量通过指针连接在一起
#include<stdio.h>
#include<stdlib.h>
//一个简单的结构体
typedef struct Node{
int data;//数据域
struct Node *next;//指针域
}Link;
创建链表(表头)
Link *createList()
{
Link *head=(Link*)malloc(sizeof(Link));
//初始化
head->next=NULL;
return head;
}
创建节点(用于插入)
Link *createNode(int data)
{
Link *newNode=(Link*)malloc(sizeof(Link));
newNode->data=data;
newNode->next=NULL;
return newNode;
}
插入节点(头插)
void insertNode(Link *head,int data)
{
//先创建一个新的节点
Link *newNode=createNode(data);
newNode->next=head->next;//先让新节点的下一个指向头节点的下一个
head->next=newNode;//再让头节点的下一个指向新节点
指定位置删除
原理:找到指定位置节点的前节点和后节点,用前节点连上后节点。
void deleteNode(Link *head,int data)
{
Link *posNode=head->next;//指定位置的节点
Link *posNodeFront=head;//指定位置节点的前一个
//先做一个判断,如果链表为空的情况
if(posNode==NULL){
perror("无法删除,链表为空");
return -1;//不正常结束
}else{
while(posNode->data!=data){
posNodeFront=posNode;//前一个节点移动到后一个节点的位置
posNode=posNodeFront->next;//后一个节点同样移到下一个
if(posNode==NULL)//找完的情况
{
printf("没有相关信息,无法删除\n");
return 0;
}
}
//如果找到了
posNodeFront->next=posNode->next;
free(posNode);
}
}
链表遍历
void printList(Link *head)
{
Link *p=head->next;//从第二个节点开始打印
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
Link *node=createList();
insertNode(node,1);
insertNode(node,2);
insertNode(node,3);
printList(node);
deleteNode(node,2);
printList(node);
return 0;
}
运行结果