程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 數據結構C語言>3基本鏈表>3-5鏈表的結點刪除

數據結構C語言>3基本鏈表>3-5鏈表的結點刪除

編輯:關於C語言

又重復了鏈表創建,鏈表輸出,鏈表結點遍歷,

主角當然是鏈表結點刪除。

鏈表結點刪除,有三種情況:

情況1,刪除頭結點。只要把鏈表結構指針,指向第二個結點。


情況2,刪除最後結點。只要把倒數第二個結點的next指針指向NULL就行。

情況3,刪除中間結點。只要把中間結點的上一個節點next指針指向中間結點的next指針指向的地方就行。

 

鏈表結點遍歷,就是為了找出要刪除的結點的上一個節點。

具體代碼如下:

 

/* ======================================== */
/*    程式實例: 3_5.c                     */
/*    鏈結串列的節點刪除                    */
/* ======================================== */
#include <stdlib.h>

struct llist                       /* 串列結構宣告          */
{
   int num;                       /* 郵寄編號              */
   struct llist *next;             /* 指向下一標簽          */
};
typedef struct llist node;         /* 定義新型態            */
typedef node *llink;               /* 定義新型態指標        */

/* ---------------------------------------- */
/*  鏈結串列的列印                          */
/* ---------------------------------------- */
void printllist(llink ptr)
{
   while ( ptr != NULL )          /* 串列走訪回路          */
   {
      printf("[%d]",ptr->num);    /* 列印節點資料          */
      ptr = ptr->next;            /* 指向下一節點          */
   }
   printf(" ");                  /* 換行                  */
}

/* ---------------------------------------- */
/*  鍵結串列的建立                          */
/* ---------------------------------------- */
llink createllist(int *array,int len)
{
   llink head;                     /* 串列的開始指標        */
   llink ptr,ptr1;
   int i;

   /* 建立第一個節點 */
   head = ( llink ) malloc(sizeof(node)); /* 配置記憶體     */
   if ( !head )                   /* 檢查指標              */
      return NULL;
   head->num = array[0];          /* 建立節點內容          */
   head->next = NULL;             /* 設定指標初值          */
   ptr = head;                    /* 將ptr指向串列開始     */
   for ( i = 1; i < len; i++ )    /* 建立其它節點回路      */
   {
       ptr1 = ( llink ) malloc(sizeof(node));
       if ( !ptr1 )
          return NULL;
       ptr1->num = array[i];      /* 建立節點內容          */
       ptr1->next = NULL;         /* 設定指標初值          */
       ptr->next = ptr1;          /* 連結節點              */
       ptr = ptr->next;           /* 指向下一節點          */
   }
   return head;
}

/* ---------------------------------------- */
/*  鏈結串列的節點走訪                      */
/* ---------------------------------------- */
llink findnode(llink head,int num)
{
   llink ptr;

   ptr = head;                    /* 指向串列起始          */
   while ( ptr != NULL )          /* 走訪串列              */
   {
      if ( ptr->num == num )      /* 找尋編號              */
         return ptr;
      ptr = ptr->next;            /* 指向下一節點          */
   }
   return ptr;
}

/* ---------------------------------------- */
/*  鍵結串列的節點刪除                      */
/* ---------------------------------------- */
llink deletenode(llink head,llink ptr)
{
   llink previous;                 /* 指向前一節點          */

   if ( ptr == head )             /* 是否是串列開始        */
      /* 第一種情況: 刪除第一個節點 */
      return head->next;          /* 傳回第二節點指標      */
   else
   {
      previous = head;
      while ( previous->next != ptr ) /* 找節點ptr的前節點 */
         previous = previous->next;

      if ( ptr->next == NULL )    /* 是否是串列結束        */
         /* 第二種情況: 刪除最後一個節點 */
         previous->next = NULL;   /* 最後一個節點          */
      else
         /* 第三種情況: 刪除中間節點 */
         previous->next = ptr->next;  /* 中間節點          */
   }
   return head;
}

/* ---------------------------------------- */
/*  主程式: 找到郵寄編號後, 將之刪除.       */
/* ---------------------------------------- */
void main()
{
   int llist1[6] = { 1, 2, 3, 4, 5, 6 }; /* 陣列內容        */
   llink head;                     /* 指向串列開始          */
   llink ptr;
   int num;                       /* 郵寄編號變數          */

   head = createllist(llist1,6);   /* 建立串列              */
   if ( !head )
   {
      printf("記憶體配置失敗! ");
      exit(1);
   }
   printf("原來的鏈表: ");
   printllist(head);              /* 列印原來串列          */
   while ( 1 )
   {
      printf("請輸入要刪除的郵寄編號 ==> ");
      scanf("%d",&num);           /* 讀取郵寄編號          */
      if ( num != -1 )
      {
         ptr = findnode(head,num); /* 找尋郵寄編號        */
         if ( !ptr )              /* 是否找到              */
            printf("沒有找到 ");
         else
         {
            head = deletenode(head,ptr); /* 刪除此節點    */
            printf("刪除後的鏈表: ");
            printllist(head);     /* 列印刪除後串列        */
         }
      }
      else
         exit(1);                 /* 結束離開              */
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved