1. 程式人生 > >關於初始化順序表,程式崩潰問題

關於初始化順序表,程式崩潰問題

下面程式是錯誤程式


/**********************************************************、
** 檔案: MergeSeqList.c 
**問題描述:利用順序儲存實現線性表的功能 
**          2、已有兩個升序排列順序表AB,融合新的順序表C 
**********************************************************/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>

#define MAXSIZE 100
typedef int DataType; /* 定義順序表為一個結構體*/ typedef struct node{ int data[MAXSIZE]; DataType length; }SeqList,*PseqList; /********順序表初始化*************** ** 函式名; Init_SeqList ** 入口引數: 無 ** 返回值; 指向順序表的指標 ** 作用:初始化順序表 ** *************************************/ PseqList Init_SeqList(){ PseqList PL; PL= (PseqList)malloc(sizeof(SeqList)); //也可以通過PL = &L實現
if(PL) PL->length = 0; return PL; } /********氣泡排序*************** ** 函式名; Bubble_Sort ** 入口引數: 順序表,資料個數 ** 返回值; 空 ** 作用:將順序表排序 ** 平均時間複雜度為 O(n^2); *************************************/ void Bubble_Sort(PseqList PL, int n) { int i, j, temp; for (j = 0; j < n - 1
; j++) for (i = 0; i < n - 1 - j; i++) { if(PL->data[i] > PL->data[i + 1]) { temp = PL->data[i]; PL->data[i] = PL->data[i + 1]; PL->data[i + 1] = temp; } } } /********AB融合為C排序**************** ** 函式名; Merge_SeqList ** 入口引數: 順序表A,順序表B, ** 順序表C的二級指標 ** 返回值; 0 失敗 ;1 成功 ** 作用:AB融合為C排序 ** 平均時間複雜度為 O(m+n); m為A的長度 n為B的長度 *************************************/ int Merge_SeqList(PseqList A, PseqList B,PseqList *C) { int i = 0,j = 0,k = 0; if(!(*C)){ printf("C表示不存在"); return 0; } if( A->length + B->length >= MAXSIZE ){ printf("C表空間不足"); return 0; } printf("\nC表示不存在"); while(i < A->length && j < B->length){ if(A->data[i] < B->data[j]) (*C)->data[k++] = A->data[i++]; else (*C)->data[k++] = B->data[j++]; } while(i < A->length) (*C)->data[k++] = A->data[i++]; while(j < B->length) (*C)->data[k++] = B->data[j++]; (*C)->length = k; return 1; } /*******MAIN主函式*************** ** 函式名; main ** 入口引數: 無 ** 返回值; 1 ** 作用:函式入口 ** *************************************/ int main(){ int i,statu; PseqList PL1,PL2,*PL; PL1 = Init_SeqList(); PL2 = Init_SeqList(); PL1->length = 9; PL2->length = 12; for(i=0; i < PL1->length ; i++){ PL1->data[i] = rand()%100+1;; } printf("\n------------------------------\n"); Bubble_Sort(PL1,PL1->length); for(i=0; i < PL1->length; i++) printf("%d\t",PL1->data[i] ); for(i=0; i < PL2->length ; i++){ PL2->data[i] = rand()%100+1;; } printf("\n-------------------------------\n"); Bubble_Sort(PL2,PL2->length); for(i=0; i < PL2->length; i++) printf("%d\t",PL2->data[i] ); **(*PL) = Init_SeqList();** statu = Merge_SeqList(PL1,PL2,PL); getch(); return 0; }

原因是*PL未進行初始化,要先為指標分配一片記憶體或者讓指標指向一個已有的物件,再去解引指標。
修改為:
PseqList pp = Init_SeqList();
PL = &pp;