首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言線性表插入刪除完整修正版:語法錯誤、缺失函數與邏輯修復

     編輯:程式設計疑難解答

原始代碼主要錯誤

  • scanf("%d,&a); 缺少右雙引號,導致「newline in constant」錯誤。
  • head=insert(head,p1); 呼叫未定義的 insert 函數。
  • p=find(head,k-1); 呼叫未定義的 find 函數。
  • printf("節點數:%d\n,count(head)); 格式字串未閉合。
  • 主函數讀入 num 卻傳遞未初始化的 k 給 delete_k_node。

完整修正代碼(含註釋)

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

typedef struct Node {
    int data;
    struct Node *next;
} Node;

Node* find(Node *head, int k) { // 尋找第 k 個節點(1-based)
    Node *p = head;
    while (p && k-- > 1) p = p->next;
    return p;
}

Node* insert(Node *head, int val) { // 有序插入
    Node *node = malloc(sizeof(Node));
    node->data = val; node->next = NULL;
    if (!head || val < head->data) {
        node->next = head; return node;
    }
    Node *p = head;
    while (p->next && p->next->data < val) p = p->next;
    node->next = p->next; p->next = node;
    return head;
}

Node* create_sort() {
    Node *head = NULL; int val;
    printf("建立有序鏈表,輸入數據以 -1 結束: ");
    while (scanf("%d", &val) == 1 && val != -1) head = insert(head, val);
    return head;
}

void print(Node *head) {
    printf("鏈表數據: ");
    for (Node *p = head; p; p = p->next) printf("%d ", p->data);
    printf("\n");
}

Node* delete_one(Node *head, int val) {
    Node *p = head, *prev = NULL;
    while (p && p->data != val) { prev = p; p = p->next; }
    if (!p) { printf("%d 不存在\n", val); return head; }
    if (!prev) head = p->next;
    else prev->next = p->next;
    free(p); printf("刪除 %d 成功\n", val); return head;
}

Node* delete_k(Node *head, int k) {
    if (k <= 0) return head;
    if (k == 1) { Node *t = head; head = head->next; free(t); printf("刪除第 1 個\n"); return head; }
    Node *prev = find(head, k-1);
    if (!prev || !prev->next) { printf("第 %d 個不存在\n", k); return head; }
    Node *t = prev->next; prev->next = t->next; free(t);
    printf("刪除第 %d 個\n", k); return head;
}

int count(Node *head) { int c=0; for(Node*p=head;p;p=p->next)c++; return c; }

void free_list(Node *head) { while(head){ Node*t=head; head=head->next; free(t); } }

int main() {
    Node *head = create_sort();
    print(head);
    printf("節點數:%d\n", count(head));
    int k, val;
    printf("輸入要刪除的位序: "); scanf("%d", &k);
    head = delete_k(head, k); print(head);
    printf("輸入要刪除的值: "); scanf("%d", &val);
    head = delete_one(head, val); print(head);
    printf("輸入要插入的值: "); scanf("%d", &val);
    head = insert(head, val); print(head);
    free_list(head);
    return 0;
}

關鍵修正點

  1. 補全 find、insert 函數實作。
  2. 修正所有 scanf、printf 格式字串引號。
  3. 主函數變數 k、val 分離,避免混用。
  4. 記憶體釋放 free_list 防洩漏。
  5. 使用 malloc/free 替代 new/delete(C 語言標準)。

執行結果示例

建立有序鏈表,輸入數據以 -1 結束: 5 3 8 1 -1
鏈表數據: 1 3 5 8
節點數:4
輸入要刪除的位序: 2
刪除第 2 個
鏈表數據: 1 5 8
輸入要刪除的值: 5
刪除 5 成功
鏈表數據: 1 8
輸入要插入的值: 4
鏈表數據: 1 4 8

掌握指標操作與函數分解是 C 語言鏈表題目拿分關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved