链表的操作

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

举报

相关文章推荐

链表

单链表反转/逆序 求单链表倒数第N个数 找到单链表的中间结点 如何判断链表是否有环的存在 单链表建环,无环链表变有环 如何知道环的长度? 如何找出环的连接点在哪里? 删除单链表中的重复元素 下面我...

链表的操作

转载自:http://www.cnblogs.com/bewolf/p/5839626.html

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

链表的操作

typedef int DataType; struct node //单向链表结点 { DataType info; node* link; }; node* creatdown()//向后生成...

链表的操作

复习数据结构和C,顺便动手实践一下比较好,便于理解,加深印象几乎都是书上的算法,翻译成C了,没什么讲的#include#includestruct iNode{    int data;    str...

链表的操作

····· 1.链表的建立{头插法,尾插法} 2.链表的输出 3.链表元素的查找 4.新元素的插入 5.元素的删除 #include #include using namespac...

链表的操作

#include #include #include int key=1; int cmp(const void* a,const void* b) {     return *(int*...

链表的操作

/* 结点0为头结点,不保存有意义的数据;从结点1开始保存有意义的数据 */ #include #include #include typedef struct node { int data;...

链表的操作

在链表操作中,如何判断删除的结点与头结点的关系? 在链表中在链表头在链表尾     删除结点之后,结点指针变成野指针,此时应最好将其赋值为NULL; //以O(1)的时间复杂度删除节点 stru...

链表的操作

1、创建,数据来自文件 2、显示 3、查找(显示比较次数) 4、插入 5、删除(显示比较次数) 6、将链接存储线性表逆置,即最后一个结点变成第1个结点,原来倒数第2个结点变成第2个结点,如此...

链表的操作

链表的操作#include #define MAX 100 typedef struct node { int value; struct node * next; } Node; ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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