妙趣橫生的算法實例1-3

#include <stdio.h>
#include <malloc.h>

typedef struct node
{
	int data;
	struct node *next;
}LNode, *LinkList;

void destroyLinkList(LinkList *list)
{
	LinkList p, r;
	p = *list;
	while(p)
	{
		r = p->next;
		free(p);
		p = r;
	}

	*list = NULL;
}

void main()
{
	LinkList current, prior, deleteNode, headList = NULL;
	int elem;
	int count = 0;

	printf("請輸入整數:\n");
	scanf("%d", &elem);
	while(count < 10 || elem != 0)
	{
		current = (LinkList)malloc(sizeof(LNode));
		current->data = elem;
		current->next = NULL;
		if(!headList)
			headList = current;		
		else
			prior->next = current;

		prior = current;
		count++;
		scanf("%d", &elem);
	}

	prior = headList;
	printf("鏈表中的值爲:\n");
	while(prior)
	{
		printf("%d ", prior->data);
		prior = prior->next;
	}
	printf("\n");

	prior = headList;
	for(count = 0; count < 3; count++)
	{
		prior = prior->next;
	}

	deleteNode = prior->next;
	prior->next = deleteNode->next;
	free(deleteNode);

	prior = headList;
	printf("刪除第五個結點後的鏈表中的值爲:\n");
	while(prior)
	{
		printf("%d ", prior->data);
		prior = prior->next;
	}
	printf("\n");

	destroyLinkList(&headList);
	printf("銷燬鏈表\n");
}


這個程序寫完之後,一碰到free();就崩潰,讓我一直以爲這裏不能用free;然後查到下面這個知識點:
char *p = (char *)malloc(10);就會產生分配10個字節。如果你把指針的地址改變了p = p + 1;然後free就要出問題,程序會崩潰。
以爲自己犯了上面這個錯誤呢,我想了想我是一個一個malloc的,並沒有範上面的錯誤,後來才發現我在創建鏈表時,current = (LinkList)malloc(sizeof(int));分配了個int型,應該分配那個結點的,current = (LinkList)malloc(sizeof(LNode));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章