线性链表
LinkList.c
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "LinkList.h"
using namespace std;
typedef struct _tag_LinkList
{
LinkListNode pHead;
int length;
}TLinkList;
LinkList* LinkList_Create()
{
int ret = 0;
TLinkList *tem = NULL;
tem = (TLinkList*)malloc(sizeof(TLinkList));//分配内存
{
if (tem==NULL)
{
ret = -1;
printf("func (TLinkList*)malloc(sizeof(TLinkList)) err %d\n", ret);
}
}
memset(tem, 0, sizeof(TLinkList));
tem->pHead.next = NULL;
tem->length = 0;
return tem;
}
void LinkList_Destroy(LinkList* list)
{
TLinkList *ptem = NULL;
if (list==NULL)
{
return;
}
ptem = (TLinkList*)list;//上层应用传下来的指针,转化成TLinkList指针
if (list!=NULL)
{
free(ptem);
}
list = ptem=NULL;
return ;
}
void LinkList_Clear(LinkList* list)
{
TLinkList*pTem = NULL;
if (list==NULL)
{
printf("LinkList_Clear() err\n");
return;
}
pTem = (TLinkList*)list;
pTem->length = 0;
pTem->pHead.next = NULL;
list = pTem;
return ;
}
int LinkList_Length(LinkList* list)
{
TLinkList*pTem = NULL;
if (list == NULL)
{
printf("LinkList_Length() err\n");
return 0;
}
pTem = (TLinkList*)list;
return pTem->length;
}
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
int ret = 0;
LinkListNode *pCurrent = NULL;//
TLinkList*pTem = NULL;
if (list == NULL||node==NULL||pos<0)
{
ret = -1;
printf("LinkList_Insert() err %d\n ",ret);
return ret;
}
pTem = (TLinkList*)list;
pCurrent = &pTem->pHead;
for (int i = 0; (i<pos) && pCurrent->next != NULL; i++)//寻找要插入的位置
{
pCurrent = pCurrent->next; //往后移动
}
//开始插入节点
node->next = pCurrent->next; //要插入的节点链接插入点的后一节点
pCurrent->next = node;//前面链接前一节点
pTem->length++;
return 0;
}
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
LinkListNode*ret = NULL;
LinkListNode *pCurrent = NULL;//
TLinkList*pTem = NULL;
if (list == NULL || pos < 0)
{
printf("LinkList_Insert() err \n ");
return NULL;
}
pTem = (TLinkList*)list;
pCurrent = &pTem->pHead;
for (int i = 0; (i < pos) && pCurrent->next != NULL; i++)
{
pCurrent = pCurrent->next; //让pCurrent往后移动
}
ret = pCurrent->next;
return ret;
}
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
LinkListNode*ret = NULL;
LinkListNode *pCurrent = NULL;//
TLinkList*pTem = NULL;
pTem = (TLinkList*)list;
if (list == NULL || pos < 0||pos>=pTem->length)
{
printf("LinkList_Insert() err \n ");
return NULL;
}
pCurrent = &pTem->pHead;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next; //让pCurrent往后移动
}
ret = pCurrent->next;//缓存要删除节点的位置
pCurrent->next = pCurrent->next->next;//核心代码
pTem->length--;
return ret;
}
LinkList.c
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_
#include <iostream>
using namespace std;
typedef void LinkList;
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode;
LinkList* LinkList_Create();//创建链表
void LinkList_Destroy(LinkList* list);//销毁链表
void LinkList_Clear(LinkList* list);//清除
int LinkList_Length(LinkList* list);//求长度
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);//插入
LinkListNode* LinkList_Get(LinkList* list, int pos);//获取
LinkListNode* LinkList_Delete(LinkList* list, int pos);//删除
#endif
main.c
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "LinkList.h"
#include <string.h>
using namespace std;
struct Student
{
LinkListNode node; //Linux内核原理:业务结点中有链表结点
char name[128];
int age;
};
void print_LinkList(void* list) //遍历打印链表
{
for (int i = 0; i < LinkList_Length(list); i++)
{
struct Student *tmp = (struct Student*)LinkList_Get(list, i);
printf("name: %s , age: %d\n", tmp->name, tmp->age);
}
}
int main()
{
Student s1;
Student s2;
Student s3;
Student s4;
strcpy(s1.name, "xiaoli"); s1.age = 20;
strcpy(s2.name, "Mingming"); s2.age = 23;
strcpy(s3.name, "Meimei"); s3.age = 22;
strcpy(s4.name, "Me"); s4.age = 25;
LinkList* list = list = LinkList_Create();
/************************************************************************/
//case1:
LinkList_Insert(list, &s1.node, 0); //把s1中的链表结点s1.node结点插入到链表list
LinkList_Insert(list, &s2.node, 0); //把s2中的链表结点s2.node结点插入到链表list
LinkList_Insert(list, &s3.node, 0); //把s3中的链表结点s3.node结点插入到链表list
LinkList_Insert(list,(LinkListNode*)(&s4.node),1);
print_LinkList(list);
cout << "删除结点" << endl;
LinkList_Delete(list, 1);
cout << "删除结点之后" << endl;
print_LinkList(list);
system("pause");
return 0;
}
/*
void main()
{
int array[15];
for (int i = 0; i < 15;i++)
{
array[i] = i;
}
for (int i = 0; i < 10; i++)
{
cout << array[i]<<" ";
}
system("pause");
}
*/