问题11:双链表的相关操作

本文详细介绍了双链表的基本操作,包括创建、测长、打印、插入和删除节点等,并提供了完整的C语言实现代码及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要涉及双链表的建立、测长、打印、插入结点以及删除结点等。

实际上跟单链表的操作差不多,只是要特别注意双链表多了指向前驱结点的指针,在写相关代码的时候要特别小心,别弄错了。

代码如下:

#include <stdio.h>
#include <malloc.h>

typedef struct student
{  
   int data;
   struct student *next;
   struct student *pre;
}dnode;


dnode *creat()
{
   dnode *head, *p, *s;
   int input, cycle = 1;
   head = (dnode *)malloc(sizeof(dnode));
   p = head;
   while(cycle)
   {
       printf("\nplease enter the data:");
	   scanf("%d", &input);
	   if(input != 0)
	   {
	      s = (dnode *)malloc(sizeof(dnode));
		  s->data = input;
		  printf("\n%d", s->data);
		  p->next = s;
		  s->pre = p;
		  p = s;
	   }
	   else
	      cycle = 0;
   }
   head = head->next;
   head -> pre = NULL;
   printf("\nThe value of the first node is: %d", head->data);
   p->next = NULL;
   return head;
}

//双链表测长,可以看出代码其实跟前面的单链表测长一样
int length(dnode *head)
{
    dnode *p;
	p = head;
	int count = 0;
	while(p)
	{
	   p = p->next;
	   count++;
	}
	return count;
}

//打印链表
void print(dnode *head)
{
   dnode *p;
   int len = length(head);
   printf("\nNOW %d node(s) in the List:", len);
   p = head;
   if(head != NULL)
   {
      while(p)
	  {
	     printf("\n     ¥¥¥¥¥  %d", p->data);
		 p = p->next;
	  }
   }
}

//双链表删除结点
//双链表的删除也别忘了有大致4种情况
//一是没有找到,二是在第一个结点,三是在最后一个结点,四是在中间的情况
dnode *delete_from_dlist(dnode *head, int num)
{
   if(head == NULL)
   {
      printf("\n链表为空!!");
      return head;
   }  
   dnode *current = head;
   while(num != current->data && current->next != NULL)
   {
       current = current->next;
   }
   if(num == current->data)
   {
       if(current == head)
	   {
	       head = head->next;
		   head->pre = NULL;
		   free(current);
	   }
	   else if(current->next == NULL)
	   {
	      current->pre->next = NULL;
		  free(current);
	   }
	   else
	   {
	       current->pre->next = current->next;
		   current->next->pre = current->pre;
		   free(current);
	   }
   }
   else
   {
      printf("\nNODE NOT FOUND!!");
   }
   return head;
}

//双链表插入结点
dnode *insert_to_list(dnode *head, int num)
{
   dnode *cur, *insert_node;
   cur = head;
   insert_node = (dnode *)malloc(sizeof(dnode));
   insert_node -> data = num;
   while(insert_node->data > cur->data && cur->next != NULL)
   {
      cur = cur->next;
   }
   if(insert_node->data <= cur->data)
   {
      if(cur == head)
	  {
	     insert_node->next = cur;
		 cur->pre = insert_node;
		 head = insert_node;
	  }
	  else
	  {
	     insert_node->next = cur;
		 insert_node->pre = cur->pre;
		 cur->pre->next = insert_node;
		 cur->pre = insert_node;
	  }
   }
   else
   {
      cur->next = insert_node;
	  insert_node->pre = cur;
	  insert_node->next = NULL;
   }
   
   return head;
}



int main(void)
{
   dnode *List = creat();
   print(List);
   List = delete_from_dlist(List, 4);
   print(List);
   List = insert_to_list(List, 5);
   print(List);
   return 0;
}

运行结果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值