源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-10-06 02:48 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C数据结构之单链表详细示例分析
[u]复制代码[/u] 代码如下:
#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; }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部