1. 程式人生 > >線性錶鏈式儲存-練習題1

線性錶鏈式儲存-練習題1

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

題目:

        寫一演算法,從鏈式表中刪除自第i個元素開始的K個元素。

思路:

        需要注意刪除結點後,一定要釋放記憶體空間。

程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define OK 1
#define ERROR 0
typedef int ElementType;
typedef struct Node {
	ElementType data;
	struct Node * next;
} List, *LinkList;

void print(LinkList H);
void initList(LinkList *H);
void createFromEnd(LinkList H);
int deleteList(LinkList L, int i, int k);
int main(int argc, char *argv[]) {
	LinkList H;
	initList(&H);
	printf("尾插法實現連結串列:\n");
	createFromEnd(H);
	printf("尾插法結果:\n");
	print(H);
	deleteList(H, 1, 9);
	printf("\n刪除連結串列部分元素後:\n");
	print(H);
	return 0;
}

/**
 *  遍歷輸出單鏈表
 */
void print(LinkList H) {
	LinkList p = H->next;
	while (p) {
		printf("%d\t", p->data);
		p = p->next;
	}
}

/**
 * 初始化連結串列
 */
void initList(LinkList *H) {
	/* 產生頭結點,並使L指向此頭結點 */
	*H = (LinkList)malloc(sizeof (List));
	(* H)->next = NULL;
}

/**
 * 以尾插法建立單鏈表
 */
void createFromEnd(LinkList H) {
	List *node;
	ElementType type;
	srand(time(0));
	int i = 0;
	for (i; i < 10; i++) {
		node = (List *)malloc(sizeof(List));
		node->data =  rand() % 100 + 1;
		H->next = node;
		H = node;
	}
	H->next = NULL;
}

/**
 * 刪除單鏈表中自第i位元素開始的k個元素
 */
int deleteList(LinkList L, int i, int k) {
	List *list = L, *p;
	int index = 0;
	while (index < i - 1 && list->next != NULL)  {
		index++;
		list = list->next;
	}
	if (index != i -1) {
		printf("\n插入位置不合法!\n");
		return ERROR;
	}
	for (index = 0; index < k && list->next != NULL; index++) {
		p = list->next;
		list->next = p->next;
		/*一定要記得釋放刪除的結點所佔記憶體空間*/
		free(p);
	}
	return OK;
}
<