一,链表———插入
要往链表中插入6,操作如下。
首先用一个临时指针t从链表的头部开始遍历。
t=head;//从链表头部开始遍历
等到指针t的下一个结点的值比6大的时候,将6插入到中间。即t->next->data大于6时进行插入,代码如下。
scanf("%d",&a);//读入待插入的数
t=head;//从链表头部开始遍历
while(t!=NULL)//当没有到达链表尾部的时候循环
{
if(t->next == NULL||t->next->data > a)
//如果当前结点是最后一个节点或者下一个结点的值大于待插入数的时候插入
{
p=(struct node *)malloc(sizeof(struct node));
p->data = a;
p->next =t->next ;
t->next =p;
break;
}
t=t->next ;
}
完整代码如下。
#include<stdio.h>
#include<string.h>
//创建一个结构体用来表示链表的结点类型
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head = NULL;//头指针初始为空
for(i = 1;i <= n;i++)
{
scanf("%d",&a);
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
p=(struct node *)malloc(sizeof(struct node));
p->data = a;//将数据存储在当前结点的data域中
p->next = NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
if(head == NULL)
head = p;//如果这是第一个结点,则将头指针指向这个结点
else
q->next = p;//如果不是,则将上一个结点的后继指针指向当前结点
q=p;//指针q也指向当前结点
}
scanf("%d",&a);//读入待插入的数
t=head;//从链表头部开始遍历
while(t!=NULL)//当没有到达链表尾部的时候循环
{
if(t->next == NULL||t->next->data > a)
//如果当前结点是最后一个节点或者下一个结点的值大于待插入数的时候插入
{
p=(struct node *)malloc(sizeof(struct node));
p->data = a;
p->next =t->next ;
t->next =p;
break;
}
t=t->next ;
}
//输出链表中的所有数
t = head;
while(t!=NULL)
{
printf("%4d",t->data );
t=t->next ;//继续下一个结点
}
return 0;
}
二,链表——删除
要删除链表中的数a时,操作如下。
首先也要用一个临时指针t从链表的头部开始遍历。
t=head;//从链表头部开始遍历
等到指针t的下一个结点的值为要删除的a时,即t->next->data等于a
时,将a删除。代码如下。
scanf("%d",&a);//读入待删除的数
t=head;
p=t->next ;
while(p!=NULL)//当没有到达链表尾部的时候循环
{
if(p->data == a)//找到a后删除
{
t->next =p->next ;
free(p);//将原有的空间释放
p=t->next ;
break;
}
else
{
p=p->next ;
t=t->next ;
}
}
完整代码如下。
#include<stdio.h>
#include<string.h>
//创建一个结构体用来表示链表的结点类型
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head = NULL;//头指针初始为空
for(i = 1;i <= n;i++)
{
scanf("%d",&a);
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
p=(struct node *)malloc(sizeof(struct node));
p->data = a;//将数据存储在当前结点的data域中
p->next = NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
if(head == NULL)
head = p;//如果这是第一个结点,则将头指针指向这个结点
else
q->next = p;//如果不是,则将上一个结点的后继指针指向当前结点
q=p;//指针q也指向当前结点
}
scanf("%d",&a);
t=head;
p=t->next ;
while(p!=NULL)
{
if(p->data == a)
{
t->next =p->next ;
free(p);
p=t->next ;
break;
}
else
{
p=p->next ;
t=t->next ;
}
}
//输出链表中的所有数
t = head;
while(t!=NULL)
{
printf("%4d",t->data );
t=t->next ;//继续下一个结点
}
return 0;
}