1. 程式人生 > >線性連結串列實現(C語言)

線性連結串列實現(C語言)

1. LinkList.h

#ifndef _LINKLIST_H

#define_LINKLIST_H

typedefvoidLinkList;

typedefstruct_Tag_LinkListNode {

LinkList* next;

} LinkListNode;

LinkList* LinkList_Create();

int LinkList_Insert(LinkList*list,LinkListNode*node,intposition);

LinkListNode* LinkList_Get(LinkList*list,intposition);

LinkListNode

* LinkList_Delete(LinkList*list,intposition);

int LinkList_GetLength(LinkList*list);

void LinkList_Destroy(LinkList*list);

void LinkList_Clear(LinkList*list);

#endif


2. LinkList.c

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#include"LinkList.h"

typedefstruct_Tag_LinkList

{

LinkListNode header;

int length;

} TLinkList;

LinkList* LinkList_Create(){

TLinkList* list = malloc(sizeof(TLinkList));

if (list == NULL) {

printf("func LinkList_Create error: malloc(sizeof(TLinkList)");

return NULL;

}

memset(list, 0, sizeof(TLinkList));

list->length = 0;

return

list;

}

int LinkList_Insert(LinkList*list,LinkListNode*node,intposition) {

int ret = 0;

if (list ==NULL) {

ret = 1;

printf("func LinkList_Insert error: ret=%d", ret);

return ret;

}

if (node ==NULL) {

ret = 2;

printf("func LinkList_Insert error: ret=%d", ret);

return ret;

}

if (position < 0) {

ret = 3;

printf("func LinkList_Insert error: ret=%d", ret);

return ret;

}

TLinkList* listTemp = (TLinkList*)list;

LinkListNode* current = (LinkListNode*)listTemp;

int len = LinkList_GetLength(list);

if (position > len) {

position = len;

}

for (int i = 0; i <position; i++) {

current = current->next;

}

node->next = current->next;

current->next = node;

listTemp->length++;

return ret;

}

LinkListNode* LinkList_Get(LinkList*list,intposition) {

int ret = 0;

if (list ==NULL) {

ret = 1;

printf("func LinkList_Get error: ret=%d", ret);

return ret;

}

TLinkList* listTemp = (TLinkList*)list;

LinkListNode* current = (LinkListNode*)listTemp;

if (position < 0 ||position >= listTemp->length) {

ret = 2;

printf("func LinkList_Get error: ret=%d", ret);

returnNULL;

}

for (int i = 0; i <position; i++) {

current = current->next;

}

return current->next;

}

LinkListNode* LinkList_Delete(LinkList*list,intposition) {

int ret = 0;

if (list ==NULL) {

ret = 1;

printf("func LinkList_Delete error: ret=%d", ret);

return ret;

}

TLinkList* listTemp = (TLinkList*)list;

LinkListNode* current = (LinkListNode*)listTemp;

if (position < 0 ||position >= listTemp->length) {

ret = 2;

printf("func LinkList_Delete error: ret=%d", ret);

returnNULL;

}

for (int i = 0; i <position; i++) {

current = current->next;

}

LinkListNode* temp = current->next;

current->next = temp->next;

listTemp->length--;

return temp;

}

int LinkList_GetLength(LinkList*list) {

int ret = 0;

if (list ==NULL) {

ret = 1;

printf("func LinkList_GetLength error: ret=%d", ret);

return ret;

}

return ((TLinkList*)list)->length;

}

void LinkList_Destroy(LinkList*list) {

if (list ==NULL) {

return;

}

free(list);

list = NULL;

return;

}

void LinkList_Clear(LinkList*list) {

if (list ==NULL) {

return;

}

TLinkList* listTemp = (TLinkList*)list;

listTemp->length = 0;

listTemp->header.next = NULL;

return;

}

3. LinkListMain.c

#include<stdlib.h>

#include<stdio.h>

#include"LinkList.h"

typedefstructTeacher {

LinkListNode node;

char name[64];

} Teacher;

void main() {

LinkList* list = LinkList_Create();

if (list == NULL) {

return;

}

Teacher t1, t2, t3;

strcpy(t1.name, "A");

strcpy(t2.name, "B");

strcpy(t3.name, "C");

LinkList_Insert(list, (LinkListNode*)&t1, 0);

LinkList_Insert(list, (LinkListNode*)&t2, 0);

LinkList_Insert(list, (LinkListNode*)&t3, 0);

int length = LinkList_GetLength(list);

for (int i = 0; i < length; i++) {

Teacher* t = (Teacher*)LinkList_Get(list, i);

printf("%s\n", t->name);

}

printf("delete\n");

while(LinkList_GetLength(list) > 0) {

Teacher* t = (Teacher*)LinkList_Delete(list, 0);

printf("%s\n", t->name);

}

printf("length:%d\n", LinkList_GetLength(list));

LinkList_Clear(list);

LinkList_Destroy(list);

system("pause");

}