線性連結串列實現(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
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");
}