可能你关于上面插入与删除你没有搞清楚,这里我再特意讲一下

上图我们需要把储存14这个数据的node插入到一和二之间,于是我们就需要更改next指针,所以之前f->next=s;就不能用了,
你可能会想到让第一个指向新节点,然后再让新节点指向第三个,如:
f->next=ins_node;
ins_node->next=f->next;
事实通常证明第一感觉是错误的,仔细看看上面代码你就会发现加入f->next=ins_node,那么第二条就相当于ins_node->next=ins_node;它指向了自己!所以我们需要反过来思考,先让新节点指向第二个,然后再让第一个指向新节点,就如上面的代码了,至于删除我没有弄出图片,我只是简单讲一下,删除是直接让第一个节点的next指向需要删除的节点,然后再让第一个节点的next指向需要删除的节点的next,你可能会思考为什么不直接让第一个节点next指向第二个呢 这个疑问你可以自己解答比较好
动态单链表实现
到这里一个简单的链表就已经实现了,但是我们还需要继续改进,因为我们有时候不知道每个节点储存的数据,所以我们就需要一个动态链表了,下面这个将实现把用户输入的数据以链式结构储存,也就是动态链表
#include
struct node
{
int data;
struct node *next;
};
node *create_linklist();
void print_linklist(node *head);
node *create_linklist(){
node *head=new node;
node *new_node,*current;//一个新节点作为当前节点
current=head;//头结点复制给当前节点
int k;
printf("输入节点个数:");
scanf("%d",&k);
for (int i = 0; i < k; ++i)
{
new_node=new node;
if(i==0)//这里也就是创建第一个节点的情况
{
head=new_node;//把头指针指向第一个节点
}
printf("输入节点数据:");
scanf("%d",&new_node->data);
current->next=new_node;//注意这里由于创建了一个新节点,而当前节点还是开始的head的那个位置,所以就需要更新一下,让当前节点next等于new_node的位置
new_node->next=NULL;//当前节点的next=NULL表示当前节点就是最后一个节点了
current=new_node;//然后把new_node节点复制给当前节点,以便继续后面的节点添加
}
return head;
}
void print_linklist(node *head)//参数传入一个头指针用来指向第一个节点
{
node *phead=head;
while(phead!=NULL)
{
printf("%d", phead->data);
phead=phead->next;
}
}
int main(){
node *h=create_linklist();
print_linklist(h);
system("pause");
}