**对于链表的插入,删除和查找的另外一种情况进行了解 **
/*
时间:2020/07/04 16:44
目的:在特定的结点前插入,删除特定的结点和查找特定结点的值
功能:对于链表的另外一种插入,删除和查找的情况进行了解
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct nodelist{
int val;
struct nodelist *pnext;
}NODE,*PNODE;
PNODE creatlist();//链表创建函数
void search(PNODE);//查找链表结点函数
void del(PNODE);//删除链表结点函数
void insert(PNODE);//插入链表结点函数
void output(PNODE);//输出链表函数
int main()
{
PNODE pHead;
pHead=creatlist();
printf("原链表为:");
output(pHead);
search(pHead);
del(pHead);
insert(pHead);
}
PNODE creatlist(){
PNODE pHead,p;
pHead=(PNODE)malloc(sizeof(NODE));
p=pHead;
int len,i,val;
printf("输入结点个数:");
scanf("%d",&len);
for(i=0;i<len;i++){//利用for循环创建链表
PNODE q=(PNODE)malloc(sizeof(NODE));
printf("第%d个结点的值:",i+1);
scanf("%d",&q->val);
p->pnext=q;
p=q;
q=NULL;
}
p->pnext=NULL;
return pHead;
}
void output(PNODE pHead){
PNODE p=pHead->pnext;
while(p!=NULL){
printf("%5d",p->val);//输出链表
p=p->pnext;
}
}
void search(PNODE pHead){
int i=0,num;
PNODE p=pHead;
printf("\n输入要查找的结点:");
scanf("%d",&num);
while(i<num&&p!=NULL){//使p移动到要查找的结点
p=p->pnext;
i++;
}
(p==NULL)?printf("该结点不存在!"):printf("该结点的数据域的值为:%d",p->val);
}
void del(PNODE pHead){
int i=0,num;
PNODE p=pHead,q;
q=(PNODE)malloc(sizeof(NODE));//q为动态分配内存的指针,只有这样才能free
printf("\n要删除的结点:");
scanf("%d",&num);
while(p->pnext!=NULL&&i<num-1)
/*
和插入的while结构一样,记住就行
注意是p->pnext,因为若要删除一个结点则要将p指向该结点的前一个结点
如果p指向了最后一个结点则说明要删除的结点不存在
如果要删除的结点存在,则通过while循环使p指向该结点的前一个结点
*/
{
i++;
p=p->pnext;
}
if(p->pnext==NULL||i>num)
printf("没有您要删除的结点!");
else{
q=p->pnext;
p->pnext=p->pnext->pnext;//将要删除的结点从链表中移除
free(q);//把要删除的结点里的数据释放掉
q=NULL;
output(pHead);//输出
}
}
void insert(PNODE pHead){
int i=0,num,val;
PNODE p=pHead;
PNODE q=(PNODE)malloc(sizeof(NODE));//创建一个动态的结点,所以q为动态分配内存的指针
printf("\n要插入的结点:");
scanf("%d",&num);
//独具一格的使用while插入,记住就好,这就叫牛人啊
while(p!=NULL&&i<num-1)
{
i++;
p=p->pnext;//while使其移动到要插入的结点之前
}
if(p==NULL||i>num)
printf("插入失败!");
else{
printf("要插入的结点的数据域:");
scanf("%d",&q->val);//注意取地址符
//进行插入操作
q->pnext=p->pnext;
p->pnext=q;
//输出
printf("插入后的链表为:");
output(pHead);
}
}
/*
总结:删除和插入的算法略有不同,不用纠结为什么那么写记住就行了
-----------------------
在dev中输出结果为
输入结点个数:3
第1个结点的值:1
第2个结点的值:2
第3个结点的值:3
原链表为: 1 2 3
输入要查找的结点:5
该结点不存在!
要删除的结点:1
2 3
要插入的结点:1
要插入的结点的数据域:0
插入后的链表为: 0 2 3 正确
-----------------------
*/