# 連結串列
```
#include <iostream>
#include <cstring>
#include <fstream>
#include <cstdio>
#include <cstdlib>
#include "linklist.h"
using namespace std;
int Compare(NODE *first,int item)
{
NODE *node=first;
NODE *node2=first;
while(node!=NULL)
{
node2=node2->next;
if(node2->data>item)
{
return node->data;
}
else
{
node=node->next;
}
}
}
int main()
{
NODE *first;
NODE* node2=first;
NODE* node=first;
int arr[]={12,99,37};
first=createList(arr,3);
printList((NODE*)first);
int a=Compare((NODE*)first,38);
node=searchNode(first,a);
insertNode(node,38);
printList((NODE*)first);
node=searchNode(first,99);
first=deleteNode(first,node);
printList((NODE*)first);
struct data
{
int b;
int *ptr;
};
data *j;
j=(data *) malloc(3*sizeof(data));
free(j);
return 0;
}
/* createList(),串列建立函數 */
NODE *createList(int *arr, int len)
{
int i;
NODE *first,*current,*previous;
for(i=0;i<len;i++)
{
current=(NODE *) malloc(sizeof(NODE));
current->data=arr[i]; /* 設定節點的資料成員 */
if(i==0) /* 判別是否為第一個節點 */
first=current;
else
previous->next=current; /* 把前一個節點的next指向目前節點 */
current->next=NULL;
previous=current;
}
return first;
}
/* printList(),串列列印函數 */
void printList(NODE* first)
{
NODE* node=first; /* 將node指向第一個節點 */
if(first==NULL) /* 如果串列是空的,則印出List is empty! */
printf("List is empty!\n");
else /* 否則走訪串列,並印出節點的data成員 */
{
while(node!=NULL)
{
printf("%3d", node->data);
node=node->next;
}
printf("\n");
}
}
/* freeList(),釋放記憶空間函數 */
void freeList(NODE* first)
{
NODE *current,*tmp;
current=first; /* 設定current指向第一個節點 */
while (current!=NULL)
{
tmp=current; /* 先暫存目前的節點 */
current=current->next; /* 將current指向下一個節點 */
free(tmp); /* 將暫存的節點釋放掉 */
}
}
/* searchNode()函數,可傳回第一個存放item之節點的位址 */
NODE* searchNode(NODE* first, int item)
{
NODE *node=first;
while(node!=NULL)
{
if(node->data==item) /* 如果node的data等於item */
return node; /* 傳回node,即該節點的位址 */
else
node=node->next; /* 否則將指標指向下一個節點 */
}
return NULL; /* 如果找不到符合的節點,則傳回NULL */
}
/* insertNode(),可在node之後加入一個新的節點 */
void insertNode(NODE *node,int item)
{
NODE *newnode;
newnode=(NODE *) malloc(sizeof(NODE)); /* 取得新節點的位址 */
newnode->data=item; /* 將新節點的data設為item */
newnode->next=node->next; /* 將新節點的next設為原節點的next */
node->next=newnode; /* 將原節點的next指向新節點 */
}
/* 刪掉node,傳回刪掉node之後,串列第一個節點的位址 */
NODE* deleteNode(NODE *first, NODE *node)
{
NODE *ptr=first;
if(first==NULL) /* 如果串列是空的,則印出Nothing to delete! */
{
printf("Nothing to delete!\n");
return NULL;
}
if(node==first) /* 如果刪除的是第一個節點 */
first=first->next; /* 把first指向下一個節點 */
else /* 如果刪除的是第一個節點以外的其它節點 */
{
while(ptr->next!=node) /* 找到要刪除之節點的前一個節點 */
ptr=ptr->next;
ptr->next=node->next; /* 重新設定ptr的next成員 */
}
free(node);
return first;
}
```
# linklist.h
```
/* linklist.h, 鏈結串列的標頭檔 */
struct node
{
int data; /* 資料成員 */
struct node *next; /* 鏈結成員,存放指向下一個節點的指標 */
};
typedef struct node NODE; /* 將struct node定義成NODE型態 */
NODE *createList(int *, int); /* 串列建立函數 */
void printList(NODE *); /* 串列列印函數 */
void freeList(NODE *); /* 釋放串列記憶空間函數 */
void insertNode(NODE *,int ); /* 插入節點函數 */
NODE *searchNode(NODE *, int ); /* 搜尋節點函數 */
NODE *deleteNode(NODE *, NODE *); /* 刪除節點函數 */
int Compare(NODE *,int );
```