双向链表的插入,删除,遍历打印


 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 typedef struct Node pNode;
 struct Node
 {
     int data;
     pNode *prev, *next;
 };
  /* 初始化链表,尾插法 */
 pNode *InitList(pNode **head, int n)
 {
     pNode *p, *s;
     (*head) = (pNode *)malloc(sizeof(pNode));
     if ((*head) == NULL)
     {
         exit(0);
     }
     (*head)->next = NULL;//head的prev和next均指向NULL
     (*head)->prev = NULL;
     p = (*head);//p指向head
     int i;
     for (i = 0; i < n; ++i)
     {
         s = (pNode *)malloc(sizeof(pNode));
         if (s == NULL)
             exit(0);
         printf("Input the value of the %dth node:", i + 1);
         scanf("%d", &s->data);
         s->next = NULL;
         p->next = s;
         s->prev = p;
         p = s;//p指向尾节点
     }
      return p;
 }
  /* 遍历打印 */
  void PrintList(pNode *head)
  {
      pNode *p;
      p = head->next;
     if (head->next == NULL)
          printf("the list is empty\n");
      while(p != NULL)
     {
         printf("%d ", p->data);
          p = p->next;
     }
     printf("\n");
 }
 /* 清空链表 */
  void DeleteList(pNode **head)
  {
      pNode *p;
      while((*head)->next != NULL)
      {
          p = (*head);
          p->next->prev = NULL;
          (*head) = p->next;
          free(p);
      }
  }

  /* 查找链表内的某个值所在结点并返回结点所在位置*/

  int SearchList(pNode *head)
  {
      int number;
      int flag=1;
      printf("Values are about to be deleted:");
      scanf("%d", &number);
      pNode *p;
      p = head->next;
      while(p != NULL)
      {
          if (p->data == number)
          {
              return flag;  //返回该值所在的结点位置
          }
          p = p->next;
          flag++;
      }
      return 0;
  }
  /* 删除链表中某个元素,令p的前驱节点和后驱节点相互指向即可,如果p是尾节点则直接将前驱节点指向NULL*/
  void DelNumqList(pNode **head, int n)
  {
      int i;
      int flag=0;
      pNode *p;
      p=*head;
      for (i = 0; i < n; ++i)
      {
          p = p->next;
     if(p->next == NULL) //如果p是尾节点则直接将前驱节点指向NULL
     {
         p->prev->next = NULL;
        free(p);
     }
     flag++;
     if(flag==n&&p->next != NULL)
     {
         p->next->prev = p->prev; //令p的前驱节点和后驱节点相互指向即可
         p->prev->next = p->next;
         free(p);
     }
 }
  }
  int main(int argc, char const *argv[])
 {
     int n, element, flag;
     pNode *head, *last;
     /***************************************************************/
     printf("Please input the size of the list:");
     scanf("%d", &n);
     last = InitList(&head, n);//初始化链表并赋值,返回尾节点last
     printf("%d %d \n", head->next->data, last->data); //打印为第一个元素和最后一个元素
     PrintList(head);
    /***************************************************************/
     flag = SearchList(head); //搜索某个值并删除节点
     if (flag > 0 && flag <= n)
     {
         DelNumqList(&head, flag);
         PrintList(head);
     }
     else
         printf("Element does not exist, cannot be deleted\n");
    /***************************************************************/
    //DeleteList(&head);//清空列表
   // PrintList(head);
    return 0;
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半岛铁盒.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值