链表增删查

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


typedef struct node
{
 int nDate;
 struct node *pstnext;
}Node;


//链表输出
void output(Node *head)
{
 Node *p = head->pstnext;
 while(NULL != p)
 {
  printf("%d  ", p->nDate); 
  p = p->pstnext;
 }
 printf("\r\n");
}


//链表建立
Node* creat()
{
 Node *head = NULL, *p = NULL, *s = NULL;
 int Date = 0, cycle = 1;
 head = (Node*)malloc(sizeof(Node));
 if(NULL == head)
 {
  printf("分配内存失败\r\n");
  return NULL;
 }
 head->pstnext = NULL;
 
 p = head;
 while(cycle)
 {
  printf("请输入数据且当输入数据为0时结束输入\r\n");
  scanf("%d", &Date);
  if(0 != Date)
  {
   s = (Node*)malloc(sizeof(Node));
   if(NULL == s)
   {
    printf("分配内存失败\r\n");
    return NULL;
   }
   s->nDate = Date;
   p->pstnext = s;
   p = s;
  }
  else
  {
   cycle = 0;
  }
 }
 p->pstnext = NULL;
 return(head);
}


//链表按值查找
void research_Date(Node *head, int date)
{
 Node *p;
 int n=1;
 p = head->pstnext;
 while(NULL != p && date != p->nDate)
 {
  p = p->pstnext;
  ++n;
 }
 if(NULL == p)
 {
  printf("链表中没有找到该值");
 }else if(date == p->nDate)
 {
  printf("要查找的值%d在链表中第%d个位置\r\n", date, n);
 }
 return;
}


//按序号查找
void research_Number(Node *head, int Num)
{
 Node *p=head;
 int i = 0;
 while(NULL != p && i < Num)
 {
  p = p->pstnext;
  i++;
 }
 if(p == NULL)
 {
  printf("查找位置不合法\r\n");
 }else if(i == 0)
 {
  printf("查找位置为头结点\r\n");
 }else if(i == Num)
 {
  printf("第%d个位置数据为%d\r\n", i, p->nDate);
 }
}


//在指定元素之前插入新结点
void insert_1(Node *head, int i, int Newdate)
{
 Node *pre = head, *New = NULL;
 int j = 0;
 while(NULL != pre && j < i-1)
 { 
  pre = pre->pstnext;
  j++;
 }
 if(NULL == pre || j > i-1)
 {
  printf("插入位置不存在\r\n");
 }else
 {
  New = (Node*)malloc(sizeof(Node));
  if(NULL == New)
  {
   printf("分配内存失败\r\n");
   return;
  }
  New->nDate = Newdate;
  New->pstnext = pre->pstnext;
  pre->pstnext = New;
 }
 
}


//在指定元素之后插入新结点
void insert_2(Node *head, int i, int Newdate)
{
 Node *pre = head, *New = NULL;
 int j = 0;
 while(NULL != pre->pstnext && j < i)
 {
  pre = pre->pstnext;
  j++;
 }
 if(j == i)
 {
  New = (Node*)malloc(sizeof(Node));
  if(NULL == New)
  {
   printf("分配内存失败\r\n");
   return;
  }
  New->nDate = Newdate;
  New->pstnext = pre->pstnext;
  pre->pstnext = New;
 }else
 {
  printf("插入位置不存在\r\n");
 }
}


//删除指定结点
void Delete_1(Node *head, int i3)
{
 Node *p = head, *pre = NULL;
 int j = 0;
 while(NULL != p && j < i3)
 {
  pre = p;
  p = p->pstnext;
  j++;
 }
 if(NULL == p)
 {
  printf("删除位置不存在\r\n");
 }else
 {
  pre->pstnext = p->pstnext;
  free(p);
 }
}


int main()
{
 int date, num;    //待查找数据
 int i3;     //指定删除元素的位置
 int i1, i2, Newdate_1, Newdate_2;    //待插入的新数据
 Node *Head = NULL;   //定义头结点
 Node *Head_New = NULL;


 //链表建立
 Head = creat();
 printf("输出建立的单链表\r\n");
 output(Head);


 //链表按值查找
 printf("请输入待查找的数据\r\n");
 scanf("%d", &date);
    research_Date(Head, date);


 //链表按序号查找
 printf("请输入待查找序号\r\n");
 scanf("%d", &num);
 research_Number(Head, num);


 //在指定第i1个元素之前插入新元素Newdate
 printf("在指定第i个元素之前插入新元素Newdate");
 printf("请输入i与元素且以逗号间隔\r\n");
 scanf("%d,%d", &i1, &Newdate_1);
 insert_1(Head, i1, Newdate_1);
 printf("插入后新链表\r\n");
 output(Head); 


 //在指定第i2个元素之后插入新元素Newdate
 printf("在指定第i个元素之后插入新元素Newdate");
 printf("请输入i与元素且以逗号间隔\r\n");
 scanf("%d,%d", &i2, &Newdate_2);
 insert_2(Head, i2, Newdate_2);
 printf("插入后新链表\r\n");
 output(Head); 


 //指定删除i3元素
 printf("删除元素的位置\r\n");
 scanf("%d", &i3);
 Delete_1(Head, i3);
 printf("删除后新链表\r\n");
 output(Head);


 return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值