创建一个链表
一、头插法创建链表:
#include <stdio.h>
struct list
{
int num;
struct list *next;
};
typedef struct list list_single;
list_single *creat_list_tail(int n)//尾插法创建一个链表,并返回一个头指针
{
int i=0;
list_single *head,*rear,*node;
head=(list_single *)malloc(sizeof(list_single));
rear=head;
for(;i<n;i++)
{
node=(list_single *)malloc(sizeof(list_single));
node->num=i+1;
rear->next=node;//新节点插在尾巴
rear=node;//这点需要着重理解
}
rear->next=NULL;
head->num=n;
return head;
}
程序看不明白,我们看看图片流程
二、删除一个节点
先上程序:
void list_delete_val(list_single *list,int val)
{
list_single *pre,*temp;
while(list!=NULL)
{
pre=list;//记录现在的节点,我的链表头指针没使用数据域,因此可以从头指针后一个节点开始查询
temp=list->next;//查询的事当前节点指向下一个节点的值
if(temp==NULL)
{
printf("没找到相关节点val=%d\n",val);
return;
}
if(temp->num==val) //找到目标节点
{
pre->next=temp->next;
free(temp); //删除后记得释放内存
return;
}
list=list->next;
}
}
这个程序还是很简单的, 输入一个链表,从当前指针的后一个节点查询val值,并保存但当前节点pre,查询到有节点(temp)的值满足要求,则让temp的上一个节点的指针域指向temp的下一个节点 pre->next=temp->next;,最后释放删除节点的内存空间
三、在链表某一位置插入节点
void list_insert(list_single *list,int i,int x)
{
list_single *target = (list_single *)malloc(sizeof(list_single));
list_single *pre;
int num=0;
target->num=x;
if(i<0) //位置最小为0 不可能小于零
{
printf("位置输入错误\n");
return ;
}
while(list!=NULL)
{
if(list->next==NULL) //在最后一个位置和第一个位置特殊处理
{
printf("这是最后一个位置\n");
list->next=target;//最后一个位置直接让最后一个节点指向目标节点,目标节点指向NULL
target->next=NULL;
return;
}
else if(i==0) //第一个位置直接让头结点指向目标节点,目标节点指向原来的第一个节点
{
pre=list->next;
printf("这是第一个位置\n");
list->next=target;
target->next=pre;
return;
}
if(num==i)
{
pre=list->next;
list->next=target;
target->next=pre;
break;
}
num++;
list=list->next;
}
}
我们不讨论简单的头尾插入,现在看看在链表中间插入的流程图