线性链表实现(C语言)

1. LinkList.h

#ifndef _LINKLIST_H

#define _LINKLIST_H

typedef void LinkList;

typedef struct_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"


typedef struct _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"


typedef struct Teacher {

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");

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值