1. 程式人生 > >線性表的鏈式儲存

線性表的鏈式儲存

#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); }