C数据结构之单链表

来源:互联网 发布:熙颐影业 知乎 编辑:程序博客网 时间:2024/05/16 00:51
 #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;}