C鏈表實現

/*
時間: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。

*/

發佈了22 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章