了解查找含有特定值的结点,把值插入到的其中特定位置,删除含有特定值的结点的操作
/*
时间:2020/07/02 12:39
目的:创建和输出单链表
功能:基本了解单链表创建,输出,查找,插入,删除
*/
#include<stdio.h>
#include<math.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct listnode
{
int date;
struct listnode *pnext;
} NODE,*PNODE;
PNODE creatlist();//返回的是NODE型指针,所以要用PNODE定义
void trase(PNODE);//输出函数
int find(PNODE,int);//查找含有特定值的结点
void insert(PNODE,int);//把值插入到的其中特定位置
void del(PNODE,int);//删除含有特定值的结点
int main()
{
int i,key,n,m;
PNODE pHead;
pHead=creatlist();
trase(pHead);
printf("\n您要查找的值为:");
scanf("%d",&key);
i=find(pHead,key);
if(i==0)
printf("所有结点中均无您要查找的值");
else
printf("第%d个结点中有您要查找的值\n",i);
printf("您要插入的值为:");
scanf("%d",&n);
insert(pHead,n);
trase(pHead);
printf("\n您要删除的值:");
scanf("%d",&m);
del(pHead,m);
trase(pHead);
}
PNODE creatlist()
{
int val,len,i;
PNODE pHead,pTail;
pHead=(PNODE)malloc(sizeof(NODE));
pTail=pHead;
printf("输入结点个数:");
//不能写成printf("输入结点个数:%d",len);因为这样len里面是垃圾值
scanf("%d",&len);
for(i=0;i<len;i++)
{
PNODE pNEW;
pNEW=(PNODE)malloc(sizeof(NODE));
//需要动态分配内存给pNew这样它所指向的存储空间for循环和函数结束后依然会保留
printf("输入第%d个结点的值:",i+1);
scanf("%d",&val);
pNEW->date=val;
pTail->pnext=pNEW;
pTail=pNEW;//以上三行为链表的一个结点的创建过程
}
pTail->pnext=NULL;//将尾节点的指针域设为NULL,从而避免野指针
return pHead;//pHead的值保持不变指向头结点,创造的pTail则可以依次连接结点
}
void trase(PNODE pHead)
{
PNODE p;//定义了一个指针来接收头指针
p=pHead->pnext;//接收头指针所指向的头结点的指针域从而指向首结点
while(p!=NULL)//用while比for方便很多
{
printf("%5d",p->date);
p=p->pnext;//将该结点的指针域赋给p从而使得p指向下一个结点
}
}
int find(PNODE pHead,int key)
{
PNODE p=pHead->pnext;
int i=0;
while(p!=NULL)
{
i++;
if(p->date==key)
return i;
else
p=p->pnext;
}
return 0;
}
void insert(PNODE pHead,int n)
{
PNODE p=pHead,q,r;
q=p->pnext;
r=(PNODE)malloc(sizeof(NODE));
//动态保存,函数结束之后r所指向的结构体不会被释放
r->date=n;
while(q!=NULL&&q->date<n)//注意是小于
{
p=q;
q=q->pnext;//不满足条件则后移一个
}
p->pnext=r;
r->pnext=q;
}
void del(PNODE pHead,int m)
{
PNODE p,q;
p=pHead;
q=(PNODE)malloc(sizeof(NODE));
q=p->pnext;
while(q!=NULL&&q->date!=m)
{
p=q;
q=q->pnext;
}
if(q==NULL)
{
printf("没有您要删除的值");
printf("\n");
}
else
{
p->pnext=q->pnext;
free(q);
q=NULL;
}
}
/*
总结:搞清楚结点创建和在输出中要将p指向下一个结点便于q创建一个新的结点
-----------------------
在dev中输出结果为
输入结点个数:4
输入第1个结点的值:2
输入第2个结点的值:4
输入第3个结点的值:5
输入第4个结点的值:9
2 4 5 9
您要查找的值为:5
第3个结点中有您要查找的值
您要插入的值为:8
2 4 5 8 9
您要删除的值:4
2 5 8 9 正确
-----------------------