加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言单链表操作(链表的建立,输出,查找,删除,插入)

(2011-02-11 18:03:54)
分类: C/C十十

简单写了一些单链表的操作,接下来还有双链表和循环链表的介绍:

 

node* creat(node* head)                            //创建新的链表

{
   node *p1, *p2;
   p1 = ( node* )malloc( sizeof( node ) );          //申请新节点
   p2 = ( node* )malloc( sizeof( node ) );
   scanf("%d", &p1->num);                          
   p1->next = NULL;                                
   while(p1->num > 0)                              
   {
    if(head == NULL)
       head = p1;                              
    else
       p2->next = p1;                          
    p2 = p1;
    p1=( node* )malloc( sizeof( node ) );        //申请下一个新节点
    scanf("%d", &p1->num);                      
   }
   p2->next = NULL;                                 //给表尾指针置为空
   return head;                                     
}

 

void print(node* head)                              //顺序输出

{
   node *temp;
   temp = head;                                    
   while(temp != NULL)                             
   {
    printf("%d  ",temp->num);                   
    temp = temp->next;                          
   }
}

 

void display(node* p)                                //单链表的逆序输出由递归完成
{
   if(p != NULL)
   {
    display( p->next );
    printf("%d  ", p->num);
    return;
   }
   return;
}

 

node* FindNode( node* p, int i)                        //单链表的查找 i为链表的查找位置
{
   if(p == NULL)
      return NULL;
   int count = 0;
   node* pNext = p;
   while(count < i && pNext != NULL)
   {
    pNext = pNext->next;
    count++;
   }
   return pNext;
}

 

bool DeleteNode( node* &head, int i )      //删除位置i的节点
{
   node* p1 = NULL;
   node* p2 = NULL;
   if( head == NULL )
      return false;
   if( i == 0)
   {
    head = head->next;
   }
   else
   {
    p1 = FindNode( head, i-1);         //上一个节点
    p2 = FindNode( head, i+1);         //下一个节点
    p1->next = p2;                      
   }
   return true;
}

 

bool InsertNode(node* &head, int x, int i)  //在i的位置插入x
{
   node* p1 = NULL;
   node* p2 = NULL;
   p1 = ( node* ) malloc ( sizeof( node ) );       //申请新节点
   if( p1 == NULL )
      return false;
   p1->num = x;
   p1->next = NULL;
   if( i == 0)                        
   {
    p1->next = head;
    head = p1;
   }
   else
   {
    p2 = FindNode(head, i - 1);
    if( p2 == NULL)
       return false;
    p1->next = p2->next;
    p2->next = p1;
   }
   return true;
}

 

node* ChooseList(node* head)             //单链表逆序(前插入法)
 {
   node* p1;                                                       
   node* p2;
   if((head == NULL)||(head->next == NULL))                  //单链表为空或只有一个节点时
      return head;
   p1 = head;                                                //p1为未逆序的链表
   head = NULL;                                              //构造一个新的空链表h
   while(p1)                                                 //取链表p1的头节点放到新链表中
    {
    p2 = p1;                                                        
    p1 = p1->next;                                           //取一次链表p1后移一
    p2->next = head;                                         //在链表h前面插入从p1上取下的节点
    head = p2;
    }
   return head;
 }

 

int main()
{
   node *head;                                      //定义头指针
   head = NULL;                                    
   head = creat(head);                             
   print(head);                                    
   cout<<endl;

   if(InsertNode(head, 123, 1))
   {
    print(head);
    cout<<endl;
   }

   if(DeleteNode(head, 4))
   {
    print(head);

    cout<<endl;
   }
   node* pp;
   pp = FindNode(head, 3);
   cout<<endl<<pp->num<<endl;

   display(head);
   return 0;

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有