C数据结构之单链表详细示例分析

 更新时间:2013年08月13日 09:28:04   作者:  
以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef struct type
{
 int num;
 struct type *next;
}TYPE;
//=============================================================
// 语法格式: TYPE *init_link_head(int n)
// 实现功能: 从头到尾,正序创建一个具有n个节点的链表,并对其值进行初始化
// 参数:  n: 链表的长度,即节点的个数
// 返回值:  所创建链表的首地址
//=============================================================
TYPE *init_link_head(int n)
{
 int i;
 TYPE *phead = NULL, *pf = NULL, *pi = NULL;
 for(i=0; i<n; i++)
 {
  pi = (TYPE *)malloc(sizeof(TYPE));
  printf("please inout num:\n");
  scanf("%d",&pi->num);
  if(i == 0)
   pf = phead = pi;
  else
  {
   pf->next = pi;
   pf = pi;
  }
  pi->next = NULL;
 }
 return phead;
}
//=============================================================
// 语法格式: TYPE *init_link_end(int n )
// 实现功能: 从尾到头,倒序创建一个具有n个节点的链表,并对其值进行初始化
// 参数:  n: 链表的长度,即节点的个数
// 返回值:  所创建链表的首地址
//=============================================================
TYPE *init_link_end(int n )
{
 TYPE *phead = NULL, *pi = NULL;
 int i ;
 for(i=0; i<n; i++)
 {
  pi = (TYPE *)malloc(sizeof(TYPE));
  printf("please inout num:\n");
  scanf("%d",&pi->num);
  if(i == 0)
   pi->next = NULL;
  else
   pi->next = phead;
  phead = pi;
 }
 return phead;
}
//=============================================================
// 语法格式: insert_link(TYPE * phead,TYPE * pi)
// 实现功能: 将新申请的节点加入到指定链表中
// 参数:  *phead:待插入链表
//    * pi:带插入节点
// 返回值:  插入指定节点后的新链表首址
//=============================================================
TYPE * insert_link(TYPE *phead, TYPE *pi)
{
 TYPE *pb, *pf;
 pb = phead;
 if(phead == NULL)
 {
  phead = pi;
  phead->next = NULL;
 }
 else
 {
  while((pi->num > pb->num) && (pb->next != NULL))
  {
   pf = pb;
   pb = pb->next;
  }
  if(pi->num <= pb->num)
  {
   if(pb == phead)
   {
    pi->next = phead;
    phead = pi;
   }
   else
   {
    pf->next = pi;
    pi->next = pb;
   }
  }
  else
  {
   pi->next = NULL;
   pb->next = pi;
  }
 }
 return phead;
}
//=============================================================
// 语法格式: delete_link(TYPE * phead,int num)
// 实现功能: 删除给定序号所指向的节点
// 参数:  *phead:待删除链表
//    num: 所需删除的节点
// 返回值:  删除指定节点后的新链表首址
//=============================================================
TYPE * delete_link(TYPE *phead, int num)
{
 TYPE *pf;
 TYPE *pb;
 if(phead == NULL)
 {
  printf("\nempty link\n");
  return NULL;
 }
 pb = phead;
 while((pb->num != num) && pb->next != NULL)
 {
  pf = pb;
  pb = pb->next ;
 }
 if(pb->num == num)
 {
  if(pb == phead)
   phead = phead->next;
  else
   pf->next = pb->next;
  free(pb);
  printf("the node is deleted\n");
 }
 else
  printf("the node not found\n");
 return phead;
}
//=============================================================
// 语法格式: print_link(TYPE * phead)
// 实现功能: 打印指定链表中的全部节点数据
// 参数:  *phead:待打印的链表首址
// 返回值:  无
//=============================================================
void print_link(TYPE *phead)
{
 TYPE *temp = phead;
 while( temp != NULL)
 {
  printf(" %d ",temp->num);
  temp = temp->next;
 }
}
//=============================================================
// 语法格式: search_num(TYPE * phead,int num)
// 实现功能: 在指定的链表中,按姓名查找指定元素
// 参数:  phead:待查找的链首址,num需要查找的字符串
// 返回值:  无
//=============================================================
void search_num(TYPE *phead, int num)
{
 TYPE *temp = phead;
 while(temp != NULL)
 {
  if(temp->num == num)
   printf("  %d ",num);
  temp = temp->next;
 }
 if(temp == NULL)
  printf("node not been found\n");
}
//=============================================================
// 语法格式: order_link(TYPE * phead)
// 实现功能: 采用冒泡法,对指定链表按序号进行排序(交换数据域)
// 参数:  phead:待排序的链首址
// 返回值:  排好序的链表phead指针
//=============================================================
TYPE *order_link(TYPE *phead)
{
 TYPE *pb,*pf,temp;
 pb = pf =phead;
 if(phead == NULL)
  return NULL;
 while(pb->next != NULL)
 {
  pf = pb->next;
  while(pf != NULL)
  {
   if(pb->num > pf->num)
   {
    temp = *pb;
    *pb = *pf;
    *pf = temp;
    temp.next = pb->next;
    pb->next = pf->next;
    pf->next = temp.next;
   }
   pf = pf->next;
  }
  pb = pb->next;
 }
 return phead;
}
//=============================================================
// 语法格式: reverse_link(TYPE * phead)
// 实现功能: 对给定链表按序号进行倒序排序
// 参数:  phead:待排序的链首址
// 返回值:  排好序的链表phead指针
//=============================================================
TYPE *reverse_link(TYPE *phead)
{
 TYPE *pb, *pf, *temp;
 pb = phead;
 pf = pb->next;
 while(pf != NULL)
 {
  temp = pf->next;
  pf->next = pb;
  pb = pf;
  pf = temp;
 }
 phead->next = NULL;
 phead = pb;
 return phead;
}
//=============================================================
// 语法格式: free_all(TYPE * phead)
// 实现功能: 释放链表中所有的节点
// 参数:  phead:待释放的链表首址
// 返回值:  无
//=============================================================
void free_all(TYPE *phead)
{
 TYPE *p;
 while(phead!=NULL)
 {
  p=phead->next;
  free(phead);
  phead=p;
 }
}
//=============================================================
// 语法格式: merge(TYPE *p1,TYPE *p2)
// 实现功能: 对两个链表进行升序合并
// 参数:  p1,p2两个代合并的链表
// 返回值:  合并后的链表
//=============================================================
TYPE *merge_link(TYPE *p1, TYPE *p2)
{
 TYPE *p, *phead;
 if(p1 == NULL)
  return p2;
 if(p2 == NULL)
  return p1;
 if(p1->num < p2->num)
 {
  phead = p = p1;
  p1 = p1->next;
 }
 else
 {
  phead = p = p2;
  p2 = p2->next;
 }
 while(p1 != NULL && p2 != NULL)
 {
  if(p1->num < p2->num)
  {
   p->next = p1;
   p = p1;
   p1 = p1->next;
  }
  else
  {
   p->next = p2;
   p = p2;
   p2 = p2->next;
  }
 }
 if(p1 != NULL)
  p->next = p1;
 else
  p->next = p2;
 return phead;
}
//=============================================================
// 实现方法:   运用递归
// 语法格式: merge(TYPE *p1,TYPE *p2)
// 实现功能: 对两个链表进行升序合并
// 参数:  p1,p2两个代合并的链表
// 返回值:  合并后的链表
//=============================================================
TYPE * merge_link_self(TYPE *p1, TYPE *p2)
{
 TYPE *phead = NULL;
 if(p1 == NULL)
  return p2;
 if (p2 == NULL)
  return p1;
 if(p1->num < p2->num)
 {
  phead = p1;
  phead->next =merge_link(p1->next, p2);
 }
 else
 {
  phead = p2;
  phead->next = merge_link(p1, p2->next);
 }
 return phead;
}
int main(void)
{
 return 0;
}

相关文章

  • C语言 扩展欧几里得算法代码

    C语言 扩展欧几里得算法代码

    这篇文章介绍了扩展欧几里得算法的实现代码,有需要的朋友可以参考一下
    2013-09-09
  • C++新特性详细分析基于范围的for循环

    C++新特性详细分析基于范围的for循环

    C++11这次的更新带来了令很多C++程序员期待已久的for range循环,每次看到javascript, lua里的for range,心想要是C++能有多好,心里别提多酸了。这次C++11不负众望,再也不用羡慕别家人的for range了。下面看下C++11的for循环的新用法
    2022-04-04
  • 关于C++中的static关键字的总结

    关于C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用
    2013-09-09
  • C++中引用和const关键字介绍

    C++中引用和const关键字介绍

    大家好,本篇文章主要讲的是C++中引用和const关键字介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C++ 中继承与动态内存分配的详解

    C++ 中继承与动态内存分配的详解

    这篇文章主要介绍了C++ 中继承与动态内存分配的详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • 使用Qt实现监听网页是否响应并导出Excel表

    使用Qt实现监听网页是否响应并导出Excel表

    Qt导出数据到excel,方法有很多,下面这篇文章主要给大家介绍了关于使用Qt实现监听网页是否响应并导出Excel表的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • VSCode无法打开源文件及无法打开链接库文件的解决方法

    VSCode无法打开源文件及无法打开链接库文件的解决方法

    本文主要介绍了VSCode无法打开源文件及无法打开链接库文件的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • c++ STL库容器之集合set代码实例

    c++ STL库容器之集合set代码实例

    在本篇文章里小编给大家整理的是关于c++STL库容器之集合set代码实例,需要的朋友们可以参考下。
    2020-03-03
  • C语言菜鸟基础教程之自定义函数

    C语言菜鸟基础教程之自定义函数

    自定义函数: 必须直接或间接在main中调用,否则该自定义函数不会被执行。 返回值类型 函数名(参数类型 参数名,参数类型 参数名...)
    2017-10-10
  • 一篇文章教你如何用C语言实现strcpy和strlen

    一篇文章教你如何用C语言实现strcpy和strlen

    这篇文章主要为大家介绍了C语言实现strcpy和strlen的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论