Spe*_*tre 0 c segmentation-fault
我正在尝试使用2个已排序的链接列表来实现merge(),并输出一个链接列表,将两者合并并进行排序.我首先创建一个数组并将项目放在那里,但是当我打印数组元素时,我得到垃圾值/ seg错误.我知道这需要很多代码,但我真的很感激能帮助的人:)
typedef struct _node {
int data;
struct _node * next;
} node_t;
typedef struct {
node_t * head;
node_t * tail;
} LL_t;
LL_t* createList(int num_nodes);
void printList(LL_t* L);
void merge(LL_t * L, LL_t * L2);
void merge(LL_t * L, LL_t * L2){
if(L2->head==NULL){ // empty L2
free(L2);
return;
}
else if(L->head==NULL){ // empty L1
*L=*L2;
free(L2);
return;
}
node_t* node=L->head;
int mid=0;
if(node->next!=NULL){
for (mid=0; node->next!=NULL; mid++) //finds last index of L1
node=node->next;
}
L->tail->next=L2->head;
L->tail=L2->tail;
node_t* ind = L->head;
free(L2);
int len=0;
for (len=0; ind!=NULL; len++) // finds num of items in list
ind=ind->next;
int arr[len];
int newarr[len];
node_t* cur= L->head;
for(int i=0; cur!=NULL; i++){ // creates array with list items
arr[i]=cur->data;
cur=cur->next;
}
int first=0;
int last=len;
int leftpos=0;
int rightpos=mid+1;
int newpos=0;
// insert elements to arr until a half of the array
// reaches mid or last
while(leftpos<=mid && rightpos<=last-1){
if(arr[leftpos]<arr[rightpos]){
newarr[newpos++]=arr[leftpos++];
}
else
newarr[newpos++]=arr[rightpos++];
}
// fills in the rest of the array
while(leftpos<=mid)
newarr[newpos++]=arr[leftpos++];
while(rightpos<=last)
newarr[newpos++]=arr[leftpos++];
for(int j=0; j<len; j++)
printf("newarr=%d\n",newarr[j]);
}
int main(void){
int num_nodes = 4;
int num_nodes2 = 3;
LL_t* L=createList(num_nodes);
LL_t* L2=createList(num_nodes2);
merge(L, L2);
}
// Creates the list. No problem here
LL_t* createList(int num_nodes){
LL_t* L = malloc(sizeof(LL_t));
L->head=NULL;
L->tail=NULL;
node_t *n;
int i=0;
for (i = 0; i < num_nodes; i++) {
n = malloc(sizeof(*n));
scanf("%d",&n->data);
n->next = NULL;
if (L->head == NULL){
L->head = n;
L->tail = n;
}
else {
L->tail->next = n;
L->tail = n;
}
}
puts("\n");
return L;
}
Run Code Online (Sandbox Code Playgroud)
问题在于merge():
while(rightpos<=last)
newarr[newpos++]=arr[leftpos++];
^^^^^^^
Run Code Online (Sandbox Code Playgroud)
这里,while循环的条件是rightpos<=last访问leftpos索引元素arr并递增它.如果rightpos小于last那么while循环条件总是true会使它成为无限循环.循环的每次迭代都while在递增leftpos,在一个阶段它的值将大于数组的大小arr并且访问超出数组大小的数组元素是未定义的行为,其中包括程序可能给出分段错误.它应该是:
while(rightpos<=last)
newarr[newpos++]=arr[rightpos++];
Run Code Online (Sandbox Code Playgroud)