程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C數據構造之單鏈表具體示例剖析

C數據構造之單鏈表具體示例剖析

編輯:關於C++

C數據構造之單鏈表具體示例剖析。本站提示廣大學習愛好者:(C數據構造之單鏈表具體示例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是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;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved