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;
}
find、insert 函數實作。scanf、printf 格式字串引號。k、val 分離,避免混用。free_list 防洩漏。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 語言鏈表題目拿分關鍵。