在指定位置插入和删除节点

在指定位置插入和删除节点

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct _node{
 int number;
 struct _node *next;
}Node;
typedef struct{
 Node *head;
 Node *tail;
}List;


void add(List *plist)
{
 int num;
 bool first=true;
 scanf("%d",&num);
 while(num!=-1)
 {
  Node *p=(Node *)malloc(sizeof(Node));
  p->next=NULL;
  p->number=num;
  if(first)
  {
   first=false;
   plist->head->next=p;
   plist->tail=p;
  }
  else{
   plist->tail->next=p;
   plist->tail=p;
  }
  scanf("%d",&num);
 } 
}


void print(List *plist)
{
 Node *p;
 for(p=plist->head->next;p;p=p->next)
  printf("%d--",p->number);
 printf("\n"); 
}


void clean_up(List *plist)
{
 Node *p;
 Node *q;
 for(p=plist->head,q=NULL;p;p=q)
 {
  q=p->next;
  free(p);
 } 
}


void insert(List *plist);
void delete_(List *plist);


int main()
{
 List list;
 list.head=(Node *)malloc(sizeof(Node));
 list.tail=NULL;
 
 printf("add untill -1:\n");
  add(&list);
 printf("in the outset the LIST is:\n");
  print(&list);
 
  insert(&list);
 printf("now the LIST is:\n"); 
  print(&list);
  
  delete_(&list);
 printf("now the LIST is:\n");
  print(&list);
   
  clean_up(&list);
}


void insert(List *plist)
{
 int location;
 int count;
 printf("input the insert location untill -1\n");
 scanf("%d",&location);
 Node *q;
 while(location!=-1)
 {
  Node *p=(Node *)malloc(sizeof(Node));  //新的节点 
  printf("input the number of news:\n");
  scanf("%d",&p->number);
      //遍历链表 
  for(count=0,q=plist->head;q;q=q->next,count++)
  {
   if(count==location)     //有头节点可以直接连接 
   {
    p->next=q->next;
    q->next=p;
    break;
   }
  }
  printf("input the insert location:\n");
  scanf("%d",&location);
 }
 
}


void delete_(List *plist)
{
 Node *p;
 Node *q;
 int location;
 int count;
 printf("input the delete location untill 0\n");
 scanf("%d",&location);
 while(location!=0)
 {
  p=plist->head->next;
  q=plist->head;
  for(count=1;p;count++)
  {
   if(count==location)
   {
    q->next=p->next;
    free(p);
    break;
   }
   q=q->next;
   p=p->next;
  }
  printf("now the LIST is:\n");
   print(plist);    //传list的地址,也就是plist 
  printf("input the delete location\n");
  scanf("%d",&location);
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值