/*
時間:2012/07/01 20:08
測試:自己模擬LinkedList
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
typedef struct Node
{
int data;
struct Node * pNext;
} NODE, * PNODE;
PNODE init(int len);
bool isEmpty(PNODE pHead);
int count(PNODE pHead);
void traverseElements(PNODE pHead);
bool appendElement(PNODE pHead, int val);
bool insertElement(PNODE pHead, int index, int val);
bool deleteElement(PNODE pHead, int index, int * deletedValAdd);
void sort(PNODE pHead);
int main(void)
{
int len;
printf("請輸入你要創建的鏈表的長度:");
scanf("%d", &len);
PNODE pHead = init(len);
traverseElements(pHead);
printf("\n");
appendElement(pHead, 6);
traverseElements(pHead);
printf("\n");
insertElement(pHead, 2, 7);
traverseElements(pHead);
printf("\n");
int val;
deleteElement(pHead, 5, &val);
printf("被刪除的元素是:%d\n", val);
traverseElements(pHead);
printf("\n");
printf("當前元素的個數是:%d\n", count(pHead) );
sort(pHead);
traverseElements(pHead);
printf("\n");
return 1;
}
PNODE init(int len)
{
PNODE pHead = (PNODE)malloc( sizeof(NODE) );
if (NULL == pHead)
{
printf("內存分配失敗,程序終止。");
exit(-1); //要導入stdlib.h頭文件
}
pHead->data = NULL;
pHead->pNext = NULL;
PNODE pTail = pHead;
int val;
for (int i=0; i<len; i++)
{
printf("請輸入第%d個元素的值:", i+1);
scanf("%d", &val);
PNODE pNew = (PNODE)malloc( sizeof(NODE) );
if (NULL == pNew)
{
printf("內存分配失敗,程序終止。");
exit(-1);
}
pNew->data = val;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
}
return pHead;
}
void traverseElements(PNODE pHead)
{
int i = 0;
while (NULL != pHead->pNext)
{
pHead = pHead->pNext;
if (i%5 == 0 && i != 0)
printf("\n");
printf("%d ", pHead->data);
i++;
}
}
bool appendElement(PNODE pHead, int val)
{
while (NULL != pHead->pNext)
{
pHead = pHead->pNext;
}
PNODE pNew = (PNODE)malloc( sizeof(NODE) );
if (NULL == pNew)
{
//printf("內存分配失敗,程序終止。");
//exit(-1);
return false;
}
pNew->data = val;
pNew->pNext = NULL;
pHead->pNext = pNew;
return true;
}
bool insertElement(PNODE pHead, int index, int val)
{
for (int i=0; i<index; i++)
{
pHead = pHead->pNext;
}
PNODE pNew = (PNODE)malloc( sizeof(NODE) );
if (NULL == pNew)
{
//printf("內存分配失敗,程序終止。");
//exit(-1);
return false;
}
pNew->data = val;
pNew->pNext = pHead->pNext;
pHead->pNext = pNew;
return true;
}
bool deleteElement(PNODE pHead, int index, int * deletedValAdd)
{
for (int i=0; i<index; i++)
{
pHead = pHead->pNext;
}
PNODE pTmp = pHead->pNext;
*deletedValAdd = pTmp->data;
pHead->pNext = pHead->pNext->pNext;
free(pTmp);
return true;
}
bool isEmpty(PNODE pHead)
{
if (pHead->pNext == NULL)
return true;
else
return false;
}
int count(PNODE pHead)
{
int i = 0;
while (NULL != pHead->pNext)
{
i++;
pHead = pHead->pNext;
}
return i;
}
void sort(PNODE pHead)//冒泡排序
{
PNODE p, q;
int tmp;
for (p = pHead; p->pNext != NULL; p=p->pNext)
{
for (q = p->pNext; q->pNext != NULL; q=q->pNext)
{
if (q->data > q->pNext->data)
{
tmp = q->pNext->data;
q->pNext->data = q->data;
q->data = tmp;
}
}
}
}
/*
總結:
==========================================================================================
頭指針:指向頭節點的指針
頭節點:數據域爲NULL,指針域指向首節點
首節點:第一個數據域非NULL的節點。
尾節點:數據域非NULL,但指針域爲NULL。
*/