链表的操作

转载 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;
}

链表建立、删除、插入基本操作

在数据结构中,链表无疑是最基本的,也是在大多数IT公司面试笔试中考察最多的;有了扎实的处理链表的基础,对以后学习更复杂的数据结构类型是很有帮助也是很有必要的;因此在闲暇时间中,又再一次重写了对于链表的...
  • wenhai_zh
  • wenhai_zh
  • 2013年07月29日 12:05
  • 3070

数据结构之链表基本操作总结

数组与链表的区别  数组(顺序存储)和链表(链式存储)是两种不同的数据存储方式。 数组是一组具有相同类型和名称的变量的集合,这些变量称为数组的元素,每个数组元素都有一个编号,这个编号称...
  • Lily_whl
  • Lily_whl
  • 2017年05月11日 18:22
  • 1308

链表的基本操作之插入、删除、逆置

提到链表,无非就是指针指来指去,最终连成一个链。好多人困惑的地方就在于p->next=r->next,指针到底是如何指向的,弄清楚这个,删、查、排的操作也就很容易弄懂了。...
  • i_am_what_i_am
  • i_am_what_i_am
  • 2016年05月29日 15:48
  • 909

单链表基本操作详解

#  单链表基本操作 文中提到的内容的链接一并列在这里: 顺序表:http://blog.csdn.net/bitboss/article/details/51559175 冒泡排序:...
  • bitboss
  • bitboss
  • 2016年06月04日 22:12
  • 2866

算法训练 9-7链表数据求和操作

算法训练 9-7链表数据求和操作  读入10个复数,建立对应链表,然后求所有复数的和。 样例输入 1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 2 3 3 1...
  • sinat_27406925
  • sinat_27406925
  • 2016年04月12日 12:50
  • 879

C++链表操作总结和常见链表操作

链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结...
  • fanyun_01
  • fanyun_01
  • 2017年02月26日 21:13
  • 1551

java 链表的常见操作

1.定义链表的节点类 class Node { protected Node next; // 下一节点 protected String data;// 数据 public Node(St...
  • kangaroo_07
  • kangaroo_07
  • 2017年08月30日 21:53
  • 207

数据结构之广义表(头尾链表存储)基本操作

#include using namespace std; typedef char AtomType; typedef enum{ ATOM, LIST }ElemTag; typedef str...
  • hgeternal
  • hgeternal
  • 2014年10月21日 21:37
  • 1318

C++实现链表逆序

链表的结构
  • a1037488611
  • a1037488611
  • 2014年10月20日 14:34
  • 1399

c++链表实例与链表基本知识

我们知道,数组是事先定义好的数组类型与长度 自动为其分配的一连续的存储单元相同数组的位置和距咯是固定的因此可以对数组元素进行随机访问。但若对数组元素进行插入和删除操做,则会引起大量的数据移动,从而使数...
  • qq_23301703
  • qq_23301703
  • 2015年07月13日 16:02
  • 870
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表的操作
举报原因:
原因补充:

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