【C语言】链表——在特定的结点前插入,删除特定的结点和查找特定结点的值

**对于链表的插入,删除和查找的另外一种情况进行了解 **

/*
 时间: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            正确 
----------------------- 
*/ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值