關於初始化順序表,程式崩潰問題
阿新 • • 發佈:2018-12-08
下面程式是錯誤程式
/**********************************************************、
** 檔案: 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;