链表的操作

转载 2006年06月07日 11:28:00

 

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

主要内容:
  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;
}

相关文章推荐

C语言链表操作

  • 2017年06月11日 14:49
  • 6KB
  • 下载

C语言链表操作

  • 2017年10月10日 10:06
  • 2KB
  • 下载

C语言之数据结构的顺序单链表创建,插入和删除操作

数据结构上机课时敲的。。之前用C++实现过简单的三元组,,但没有用C语言实现。所以试了试,课本上的参数传递都是用的引用的形式,而如果要用C语言实现的话就都需要改为指针传递的形式。 下面有一个重点就是删...
  • sxtopc
  • sxtopc
  • 2016年09月18日 22:47
  • 259

c语言文件的输入链表机器操作

  • 2017年10月10日 03:29
  • 39KB
  • 下载

单链表的基本操作

  • 2014年11月25日 18:29
  • 4KB
  • 下载

数据结构上机测试2-1:单链表操作A

数据结构上机测试2-1:单链表操作A Time Limit: 1000ms   Memory limit: 4096K  有疑问?点这里^_^ 题目描述 输入n个整数,先按照数据...

java对链表的操作

  • 2014年08月07日 14:38
  • 4KB
  • 下载

单链表的操作

  • 2014年09月26日 15:58
  • 2KB
  • 下载

带头结点的链表的创建与操作

list.c #include #include #include "list.h" List MakeEmpty(List L) { if(L !=NULL) DeleteList(L);...
  • jw903
  • jw903
  • 2014年03月22日 22:38
  • 759

双链表操作

  • 2014年08月13日 22:40
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表的操作
举报原因:
原因补充:

(最多只允许输入30个字)