作者 主題: 請問把新增變成刪除如何更改?  (閱讀 1859 次)

0 會員 與 1 訪客 正在閱讀本文。

a122318369

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
請問把新增變成刪除如何更改?
« 於: 2009-11-23 20:28 »
老師出這題
我看無
求助感恩
慢慢學習當中




#include <stdio.h>
#include <stdlib.h>
struct student //定義一個叫student的結構, 裡面包含chinese與english兩科, 以及指向下一筆資料的指標
{
       int chinese, english;
       struct student *next;    //宣告一個叫next的指標變數, 它的大小就是student的大小
};

struct student *create(struct student *z)        //用來產生新節點的副程式
{
       struct student *x;
       x = malloc(sizeof(struct student));   //向作業系統要一個x指標大小的空間, 並且把它的位址傳給x
       printf("國文:");
       scanf("%d", &x->chinese);
       if (x->chinese <0) //如果國文輸入的值小於1, 則代表輸入結束, 傳NULL回去
          return NULL;    
       printf("英文:");
       scanf("%d", &x->english);
       x->next = NULL;           //將指向下一個格子的指標x->next的值設為空值, 用來代表尾巴什麼都沒用
       if (z != NULL)           //如果傳進來的不是空值, 則代表前面有資料
          z->next = x;          //我就把前一筆資料(z)的下一個節點(z->next)記載為剛剛產生的節點
       return x;
}

void display(struct student *p)
{
     if (p == NULL) //如果傳進來的是NULL,代表到資料尾端(或是最後一個節點)
        return ;    //所以不做事, 結束副程式
     else      //否則代表不是尾巴, 要印出答案
     {
         printf("國文: %d, 英文:%d\n", p->chinese, p->english);
         display(p->next); //遞迴, 把下一個節點傳給自己
     }
        
}

struct student *insert(struct stducent *h)
{
 //在第n筆的地方新增一筆資料
  struct student *p, *x;
  int i=0, n;
  printf("新增第幾筆資料:");
  scanf("%d", &n);
  do          //先找到第幾筆資料
  {
     x = p;   //x用來標定上一筆資料, p用來標定第n筆資料
     i++;
     if (i == 1)  //代表是第一資料
        p = h;    //既然是第一筆資料, 我們就從頭開始, 所以把p指到h去
     else   //否則代表不是第一筆, 於是移到下一筆資料去
        p = p->next;
     if (p == NULL)  //代表資料移動到尾巴還不夠, 所以n的值是不合法的.
     {
        printf("資料不足!\n");
        return h;
     }
  } while (i < n);
  // while結束時, p指向第n筆資料, x則是p的上一筆資料
  x = create(x);  //建立新資料, 順便把上一筆資料的尾巴指向x之後, 把新的位址丟給x
  if (n == 1) //代表從頭插入資料
     h = x;   //所以把開頭的指標指向新資料就可以了
  x->next = p;    //把新資料的next抄入第n筆資料
  return h;
}

int main(int argc, char *argv[])
{
  int n, i=0;
  struct student *h, *p, *x;
  h = NULL;
  p = NULL;
  do
  {
      p = create(p);
      if (h == NULL)
         h = p ;
  } while (p != NULL);
  
  display(h);

  h = insert(h);  //呼叫insert()新增資料
  display(h); //印出新資料

  
  system("PAUSE");   
  return 0;
}

請修改把新增變成刪除.
« 上次編輯: 2009-11-23 20:40 由 a122318369 »