链表的操作

 

链表是数据结构中的一个重要组成部分,对链表操作的熟练度怎么要求都不过分。
(只有部分核心代码)

主要内容:
  1) 链表的建立
  2) 链表的释放
  3) 链表的查找
  4) 链表中节点的插入
  5) 链表中节点的删除
  6) 链表的反转
  7) 两个链表的连接


#define MAX 15
/* 节点声明 */
struct list
{
   int number;
   int name[MAX];
   struct list *next;
};
typedef struct list Node;
typedef Node *Link;



/* 建立链表,返回指向头节点的指针 */
Link Creat_List(Link head)
{
   int dataNum;                /* 数据编号 */
   char dataName[MAX];            /* 数据名字 */
   Link newNode;
   Link pointer;
   int i;

   /* 创建头节点 */
   head = (Link) malloc(sizeof(Node));            /* 分配内存 */

   if( NULL == head )
       printf(" Allocation Failure/n");        /* 分配内存失败 */
   else
   {
       dataNum = 1;
       printf("Enter the data name:/n");
       scanf("%s",dataNum);
       head->number = dataNum;

       for( i=0; i<MAX; ++i)
           head->name[ i] = dataNum[ i];

       head->next = NULL;

       pointer = head;

       /* 创建链表 */
       while(1)
       {
           dataNum++;

           newNode = (Link)malloc(sizeof(Node));
           printf("Enter the data name:/n");
           sacnf("%s",dataName);

           if(dataName[0] == '0')            /* 输入0,结束 */
               break;

           newNode->number = dataNum;
           for( i=0; i<MAX; ++i)
               newNode->name[ i] = dataName[ i];
           newNode->next = NULL;

           pointer->next = newNode;        /* 连接新节点 */

           pointer = newNode;
       }
   }

   return head;
}



/* 释放链表 */
void free_list(Link head)
{
   Link pointer;

   while( head != NULL )
   {
       pointer = head;
       head = head->next;
       free(pointer);
   }
}



/* 链表的查找 */
int Search_list(int key, Link head)            /* key 为要查找的数据 */
{
   Link pointer;
   pointer = head;

   while( pointer != NULL )
   {
       if( pointer->number == key )
       {
           printf("found it!/n");
           return 1;
       }
   }

   return 0;
}



/* 节点的插入 */
Link Insert_list(Link head, Link newNode, int key)        
{
   Link pointer;
   pointer = head;

   while(1)
   {
       /* 在链表头之前插入 */
       if( NULL == pointer )
       {
           newNode->next = head;
           head = newNode;
           break;
       }

       /* 在链表其他地方插入 */
       if( pointer->number == key )
       {
           newNode->next = pointer->next;
           pointer->next = newNode;
           break;
       }

       pointer = pointer->next ;

       return head;
   }
}



/* 链表里节点的删除 */
Link Delete_list(Link head, int key)
{
   Link pointer;
   Link back;

   pointer = head;

   while(1)
   {
       if( pointer->next == NULL )
       {
           printf("not found./n");
           break;
       }
       
       /* 删除的节点是头节点 */
       if( head->number == key)
       {
           head = pointer->next ;
           free(pointer);
           break;
       }

       /* 删除链表中其他节点 */
       back = pointer;
       pointer = pointer->next ;
       
       if( pointer->next == key )
       {
           back->next = pointer->next ;
           free(pointer);
           break;
       }
   }

   return head;
}



/* 链表的反转 */
Link Reverse_list(Link head)
{
   Link pointer;
   Link back;
   Link nextNode;

   back = head;        /* back 指针设为首节点 */
   pointer = back->next;
   back->next = NULL;

   nextNode = pointer->next;
   pointer->next = back;
   back = pointer;
   pointer = nextNode;

   while( pointer->next != NULL )
   {
       nextNode = pointer->next;
       pointer->next = back;
       back = pointer;
       pointer = nextNode;
   }
   /* 达到链表尾 */
   pointer->next = back;
   head = pointer;

   return head;
}



/* 两个链表的连接 */
Link Connect_list( Link head1, Link head2)
{
   Link pointer;
   Link back;
   Link nextNode;

   pointer = head1;

   while( pointer->next != NULL )
       pointer = pointer->next;

   pointer->next = head2;

   return head1;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值