C語言實(shí)現(xiàn)常用數(shù)據(jù)結(jié)構(gòu):帶頭結(jié)點(diǎn)的單鏈表(第3篇)

單鏈表

單鏈表使用指針來保存線性表數(shù)據(jù)元素的關(guān)系。

實(shí)現(xiàn)要點(diǎn):

1.使用指針來指向下一個(gè)數(shù)據(jù)元素。

2.單鏈表分為帶頭結(jié)點(diǎn)的單鏈表、不帶頭結(jié)點(diǎn)的單鏈表。

3.使用帶頭結(jié)點(diǎn)的單鏈表不需要對(duì)空表進(jìn)行特殊處理,簡化操作。

優(yōu)缺點(diǎn)和適用場景:

適用于進(jìn)行大量插入、刪除操作的場景,不具備隨機(jī)存取的特性,訪問數(shù)據(jù)必須循環(huán)遍歷。

使用示例

功能:輸入數(shù)據(jù)個(gè)數(shù)和數(shù)據(jù),逆序保存到順序表,并逆序輸出顯示到屏幕。

運(yùn)行結(jié)果如下:

請(qǐng)輸入數(shù)據(jù)總個(gè)數(shù):10

請(qǐng)依次輸入10個(gè)整數(shù):0 1 2 3 4 5 6 7 8 9

單鏈表輸出結(jié)果:9 8 7 6 5 4 3 2 1 0

單鏈表刪除5位置數(shù)據(jù)后輸出結(jié)果:9 8 7 6 4 3 2 1 0

代碼實(shí)現(xiàn):帶頭點(diǎn)的單鏈表

*/
#include <stdio.h>
#include <stdlib.h>


// 定義單鏈表數(shù)據(jù)結(jié)構(gòu) 
typedef struct list_node
{
  int data;
  struct list_node *next;
}list_node;


// 創(chuàng)建和初始化空鏈表 
list_node *create_link_list()
{
  // 創(chuàng)建頭節(jié)點(diǎn) 
  list_node *head = (list_node *)malloc(sizeof(list_node));
  // 頭結(jié)點(diǎn)的data域保存長度
  if(head == NULL)
    return NULL;
  head->data = 0;
  head->next = NULL;
  return head; 
}


// 增加
int insert_link_list(list_node *list, int data ,int pos)
{
  if(list == NULL || pos < 1 || pos > list->data+1)
    return -1;
  list_node *node = (list_node *)malloc(sizeof(list_node));
  if(node == NULL)
    return -1;
  node->data = data;
  node->next = NULL;
  // 循環(huán)找到插入的位置 
  int i;
  list_node *p = list;
  for(i=0; i<pos-1; i++)
    p = p->next;
  node->next = p->next;
  p->next = node;
  list->data++;
  return 0;
}


// 刪除 
int delete_link_list(list_node *list, int *data, int pos)
{
  if(list==NULL || pos < 1 || pos > list->data)
    return -1;
  
  // 循環(huán)找到要?jiǎng)h除的元素前一個(gè)位置
  int i;
  list_node *p = list;
  for(i=0; i<pos-1; i++)
    p = p->next;
  
  list_node *q = p->next;
  *data = q->data;
  p->next = q->next;
  free(q);
  list->data--;
  return 0;  
}


// 查看 
void print_link_list(list_node *list)
{
  if(list != NULL)
  {
    list_node *p = list;
    while((p=p->next) != NULL)
      printf("%d ", p->data);
    printf("\n");
  }
 } 
 
 // 銷毀
void free_link_list(list_node *list)
{
   if(list != NULL)
   {
     list_node *p = NULL;
     while((p=list->next) != NULL)
     {
       list->next = p->next;
      free(p); 
    }
    free(list);
  }
}


int main(void)
{
  list_node *list = create_link_list(); 
    
  int n,d;
  printf("請(qǐng)輸入數(shù)據(jù)總個(gè)數(shù):");
  scanf("%d", &n);
  printf("請(qǐng)依次輸入%d個(gè)整數(shù):", n);
  int i;
  for(i=0; i<n; i++)
  {
    scanf("%d", &d);
    // 每次插入到鏈表首位,這樣實(shí)現(xiàn)倒序 
    insert_link_list(list, d, 1); 
  }  
  printf("單鏈表輸出結(jié)果:");
  print_link_list(list); 
  
  printf("單鏈表刪除%d位置數(shù)據(jù)后輸出結(jié)果:",n/2);
  delete_link_list(list, &d, n/2);
  
  print_link_list(list); 
  free_link_list(list);
  
  return 0;
}

其實(shí)做為一個(gè)學(xué)習(xí)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要這里我推薦一個(gè)C/C++基礎(chǔ)交流583650410,不管你是小白還是轉(zhuǎn)行人士歡迎入駐,大家一起交流成長。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容