線性表的鏈式儲存
#include <stdio.h> #include <malloc.h> #include <stdbool.h>
typedef int ElemType; typedef struct NODE{ ElemType data; struct NODE* next; }Node,*NodePtr;//連結串列節點 typedef struct LIST{ NodePtr head; int size; }List,*ListPtr;//連結串列,頭結點為0位置
ListPtr InitList();//初始化連結串列
void InsertList(ListPtr L, int i, ElemType e);//如果i滿足條件在連結串列的i位置插入元素e
void DeleteList(ListPtr L, int i, ElemType* e);//如果i滿足條件在連結串列的i位置刪除元素,並用e返回他的值
bool EmptyList(ListPtr L);//判斷連結串列是否為空
int LengthList(ListPtr L);//返回連結串列長度
void GetElemType(ListPtr L, int i, ElemType* e);//用e返回連結串列i位置的元素
void FreeList(ListPtr L);//釋放連結串列記憶體
void PrintList(ListPtr L);//列印連結串列
void InsertTail(ListPtr L, ElemType e);//尾插法將元素插入表尾
int main() { puts("建立連結串列"); ListPtr L = InitList(); puts("判斷連結串列是否為空"); if (EmptyList(L)) { puts("連結串列為空"); } else { puts("連結串列不為空"); } puts("輸出連結串列長度"); printf("%d\n", LengthList(L)); puts("將0到9插入連結串列當中"); for (int i = 0; i < 10; i++) { InsertTail(L, i); } puts("刪除連結串列中第5個元素,並用e返回它的值"); ElemType e; DeleteList(L, 5, &e); printf("e的值是%d\n", e); puts("判斷連結串列是否為空"); if (EmptyList(L)) { puts("連結串列為空"); } else { puts("連結串列不為空"); } puts("輸出連結串列長度"); printf("%d\n", LengthList(L)); puts("列印連結串列"); PrintList(L); puts("釋放連結串列記憶體"); FreeList(L); system("pause"); return 0; }
ListPtr InitList() { ListPtr L = (ListPtr)malloc(sizeof(List)); L->head = (NodePtr)malloc(sizeof(Node)); L->head->next = NULL; L->size = 0; return L; }
void InsertList(ListPtr L, int i, ElemType e) { if (i < 1 || i > L->size + 1) { return; } NodePtr newnode = (NodePtr)malloc(sizeof(Node)); newnode->data = e; newnode->next = NULL; NodePtr temp; temp = L->head; int count = 0; while (count != i - 1) { temp = temp->next; count++; } newnode->next = temp->next; temp->next = newnode; L->size++; }
void DeleteList(ListPtr L, int i, ElemType* e) { if (i < 0 || i > L->size) { puts("1111"); return; } if (EmptyList(L)) { return; } NodePtr temp; temp = L->head; int count = 0; while (count != i - 1) { temp = temp->next; count++; } *e = temp->next->data; NodePtr freenode = temp->next; temp->next = temp->next->next; free(freenode); L->size--; }
bool EmptyList(ListPtr L) { if (L->size == 0) { return true; } else { return false; } }
int LengthList(ListPtr L) { return L->size; }
void GetElemType(ListPtr L, int i, ElemType* e) { if (i < 0 || i > L->size) { return; } if (EmptyList(L)) { return; } NodePtr temp; temp = L->head; int count = 0; while (count != i - 1) { temp = temp->next; count++; } *e = temp->next->data; }
void FreeList(ListPtr L) { if (!EmptyList(L)) { return; } NodePtr tempnode = L->head->next; NodePtr freenode; while (tempnode != NULL) { freenode = tempnode; tempnode = tempnode->next; free(freenode); } }
void PrintList(ListPtr L) { NodePtr tempnode = L->head->next; while (tempnode != NULL) { printf("%d ", tempnode->data); tempnode = tempnode->next; } putchar('\n'); }
void InsertTail(ListPtr L, ElemType e) { InsertList(L, LengthList(L) + 1, e); }