#include<stdio.h>
#include<stdlib.h>
struct data
{
int num;
struct data *next;
};
typedef struct data dt;
dt *creat() //建立链表
{
dt *head,*p1,*p2;
p1=p2=(dt *)malloc(sizeof(dt));
printf("Please enter the data:\n");
scanf("%d",&p1->num);
head=NULL;
while(p1->num!=-1)
{
if(head==NULL) head=p1;
else p2->next=p1;
p2=p1;
p1=(dt *)malloc(sizeof(dt));
scanf("%d",&p1->num);
}
p2->next=NULL;
return head;
}
dt sort(dt *head) //升序排序
{
dt *p1,*p2,*p;
int t; //定义整型变量
p2=p=head; //p2,p指向第一个节点
p1=head->next; //p1指向第二个节点
while(p->next!=NULL) //注意判断条件
{
do{
if(p1->num<p2->num){
p2=p1; //p2指向本次循环中最小的数
}
p1=p1->next; //p1从第二个节点开始向后移
}while(p1!=NULL); //注意判断条件
t=p2->num; //p2指向的数与本次循环的第一个数交换
p2->num=p->num; //
p->num=t; //
p2=p=p->next; //p2,p均向后移
p1=p->next; //p1移到p2紧挨着p2后面的一个节点
}
}
dt *delet(dt *head) //删除节点,删除所有符合条件的节点
{
int i,n,b=0;
dt *p1,*p2,*pb; //定义两个结构体指针变量
pb=p1=head; //一个指向表头,即要向后移动的指针变量
printf("请输入要删除的节点:\n");
scanf("%d",&n);
while(pb!=NULL) //遍历链表,用b来记录所要删除节点出现的次数
{
if(pb->num==n)
b++;
pb=pb->next;
}
for(i=0;i<b;i++)
{
while(p1->num!=n&&p1->next!=NULL) //找到要删除的节点
{
p2=p1; //p2记住p1之前的节点
p1=p1->next; //p1向后移动
} //找到,p1指向要删除的节点,p2指向前一个节点;未找到,则p1指向表尾
if(p1->num==n)
{
if(p1==head) head=p1->next; //删除节点为第一个节点,刷新表头
else p2->next=p1->next; //删除的节点位于中间和表尾
}
pb=p1;
p1=p1->next;
free(pb); //从当前符合条件的节点继续向后移,找到第二个节点
}
return head;
}
void list(dt *p) //输出链表
{
do{
printf("%d\t",p->num);
p=p->next;
}while(p!=NULL);
printf("\n");
}
dt find(dt *p,int m) //查找节点
{
int i=0,a=0;
while(p!=NULL)
{
i++;
if(p->num==m){
a++;
printf("链表的第%d个节点: %d\n",i,p->num);
}
p=p->next;
}
if(a==0)
printf("未找到!\n");
}
dt *insert(dt *head,dt *newp) //插入节点
{
dt *p1,*p2;
p1=head;
if(p1==NULL) //如果是空链表,作为第一个节点插入
{
head=newp;
newp->next=NULL;
}
else //不是空链表
while(newp->num>p1->num&&p1->next!=NULL)//默认按升序排列,找插入位置
{
p2=p1;
p1=p1->next;
}
if(newp->num<=p1->num)//如果为真,则插入节点不在表尾
{
if(p1==head){ //插在第一个节点之前
head=newp;
newp->next=p1;
}
else{ //插在p1之前
p2->next=newp;
newp->next=p1;
}
}
else{ //插在表尾
p1->next=newp;
newp->next=NULL;
}
return head;
}
int length(dt *p) //求链表的长度
{
int j=0;
while(p!=NULL)
{
j++;
p=p->next;
}
printf("链表的长度为: %d",j);
printf("\n");
}
int main()
{
dt *head,*pd,*newp,*pi,*p1;
int m;
head=creat(); //获取链表的头指针
list(head); //输出原始链表
printf("Please enter a find num:\n");
scanf("%d",&m); //读入要查找的节点
find(head,m); //查找
length(head); //求链表长度
sort(head); //升序排序
printf("排序后的链表\n");
list(head); //输出排序后的链表
newp=(dt*)malloc(sizeof(dt)); //为插入节点开辟空间
printf("请输入要插入的节点:\n");
scanf("%d",&newp->num); //读入插入节点
pi=insert(head,newp); //插入后刷新表头
printf("插入后的链表:\n");
list(pi); //输出插入后的链表
pd=delet(head); //删除后刷新表头
printf("删除后的链表:\n");
list(pd); //输出删除后的链表
}
链表的动态建立,输出,排序,查找,插入,删除,释放,求长度
最新推荐文章于 2023-12-22 09:27:35 发布