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

C語言數據結構代碼診斷:順序表實現中的五大硬傷

     編輯:程式設計疑難解答

代碼現場:順序表基本操作實現

提交代碼包含初始化、插入、刪除、查找、輸出等操作,但存在多處關鍵錯誤導致編譯失敗與邏輯漏洞。

五大硬傷逐一拆解

1. 頭文件缺失

// 錯誤
#include
// 正確
#include 
#include 

2. 循環條件寫法錯誤

// 錯誤:ilength 非法標識符
for (i=0; i<length; i++)  

// 正確:應使用結構體成員
for (i=0; i<L->length; i++)

3. 初始化邏輯錯誤

// 錯誤:指針相減得元素個數,但未分配內存
L->length = &L->data[20] - &L->data[0] + 1; // 恒為21

// 正確:初始長度為0
L->length = 0;

4. 插入演算法邏輯反轉

// 錯誤:循環條件與移動方向相反
for (j=L->length-1; j>=i-1; j--) // 應從後向前移動
    L->data[j+1] = L->data[j];

5. 刪除函數返回類型與邏輯錯誤

// 錯誤:返回ElemType* 但實際返回局部指針
ElemType* delete(sqlist* L, int i, ElemType* e)

// 正確:返回狀態碼,用輸出參數帶回數據
int delete(sqlist* L, int i, ElemType* e) {
    if (i < 1 || i > L->length) return 0;
    *e = L->data[i-1];
    for (int j=i; jlength; j++)
        L->data[j-1] = L->data[j];
    L->length--;
    return 1;
}

規範化代碼模板

#include 
#include 

#define MAXSIZE 20
typedef int ElemType;

typedef struct {
    ElemType data[MAXSIZE];
    int length;
} SqlList;

// 初始化
void InitList(SqlList *L) { L->length = 0; }

// 插入
int ListInsert(SqlList *L, int i, ElemType e) {
    if (i < 1 || i > L->length + 1) return 0;
    if (L->length >= MAXSIZE) return 0;
    for (int j = L->length; j >= i; j--)
        L->data[j] = L->data[j-1];
    L->data[i-1] = e;
    L->length++;
    return 1;
}

// 刪除
int ListDelete(SqlList *L, int i, ElemType *e) {
    if (i < 1 || i > L->length) return 0;
    *e = L->data[i-1];
    for (int j = i; j < L->length; j++)
        L->data[j-1] = L->data[j];
    L->length--;
    return 1;
}

新手避坑清單

  • 大括號換行、縮進統一,養成良好編碼風格
  • 善用編譯器警告(-Wall -Wextra)與調試器單步跟蹤
  • 邊界條件(空表、滿表、首尾位置)必須測試
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved