天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

双向链表内结点的插入

Posted on 2012-02-28 00:35 hoshelly 阅读(622) 评论(0)  编辑 收藏 引用 所属分类: DS && Algorithm
#include<stdlib.h>
#include<stdio.h>
struct dlist  //双向链表结构声明
{
   int data;
   struct dlist *front;//指向下一结点的指针
   struct dlist *back; //指向前一结点的指针
};
typedef struct dlist dnode;//双向链表新类型
typedef dnode *dlink;//双向链表指针新类型
void printdlist(dlink head)
{
   while (head!=NULL)
   {
      printf("[%d]",head->data);
  head=head->front;
    }
printf("\n");
}
//双向链表结点的插入
dlink insertnode(dlink head,dlink ptr,int value)
{
   dlink new_node;
   //创建新结点,分配结点内存
   new_node=(dlink)malloc(sizeof(dnode));
   if(!new_node)
   return NULL;
   new_node->data=value;
   new_node->front=NULL;
   new_node->back=NULL;
   
   if(head == NULL)
   return new_node;
   
   if(ptr == NULL)
   {
       //第一种情况:插在第一个结点之前,成为链表开始
   new_node->front=head;
   head->back=new_node;
   head=new_node;
}
else
{
   if(ptr->front == NULL)
   {
      //第二种情况:插在链表的最后
  ptr->front=new_node;//最后结点指向新结点
  new_node->back=ptr;//新结点指回最后结点
}
   else
   {
      //第三种情况:插入结点至链表中间结点内
  ptr->front->back=new_node;//下一结点指回新结点
  new_node->front=ptr->front;//新结点指向下一结点
  new_node->back=ptr; //新结点指回插入结点
  ptr->front=new_node; //插入结点指向新结点
}
}
return head;//返回链表起始指针
}
//主程序:使用插入结点的方式来创建链表,完成后将链表内容输出
void main()
{
   dlink head = NULL;//循环链表指针
   dlink tail = NULL;//链表最后的指针
   int list[6]={1,2,3,4,5,6};
   int i;
   head = insertnode(head,head,list[0]);
   printdlist(head);
   tail = head;//保留链表最后指针
   //第一种情况:插在第一个结点之前
   head=insertnode(head,NULL,list[1]);
   printdlist(head);
   //第二种情况:插在链表的最后
   head = insertnode(head,tail,list[2]);
   printdlist(head);
   for(i=3;i<6;i++)
   {
      //第三种情况:插入结点至链表中间结点内
  head = insertnode(head,head,list[i]);
  printdlist(head);
    }
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理