头文件:
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#define SUCCESS 0
#define FAILURE -1
struct node
{
int data;
struct node *next;
};
typedef struct node Node;
typedef Node *LinkList;
int ListInit(LinkList *L);
int ListInsert(LinkList L, int k, int e);
int ListLength(LinkList L);
int ListTraverse(LinkList L);
int ListDelete(LinkList L, int k, int *e);
int ListLocate(LinkList L, int k);
int ListClear(LinkList L);
int Destroy(LinkList *L);
#endif
主函数:
#include <stdio.h>
#include "Linklist.h"
int main()
{
int ret, i, e;
LinkList list;//定义头指针,是一个结构体指针,没有初始化是一个随机值
ret = ListInit(&list);//要把指针的地址传进去,就如同一个整型你要改变值,需要取地址一样
if(ret == SUCCESS)
{
printf("Init Success!\n");
}
else
{
printf("Init Failure!\n");
}
for(i = 0; i < 5; i++)
{
ret = ListInsert(list, i + 1, i);//把i插入到第i+1个结点
if(SUCCESS == ret)
{
printf("Insert %d success!\n", i);
}
else
{
printf("Insert %d failed!\n", i);
}
}
ret = ListLength(list);
printf("the length is %d\n", ret);
ret = ListTraverse(list);
if(ret == SUCCESS)
{
printf("Traverse success!\n");
}
else
{
printf("Traverse failure!\n");
}
ret = ListDelete(list, 3, &e);//删除第3个数
if(ret == SUCCESS)
{
printf("Delete %d success!\n", e);
}
else
{
printf("Delete %d failure!\n", e);
}
ret = ListTraverse(list);
if(ret == SUCCESS)
{
printf("Traverse success!\n");
}
ret = ListLocate(list, 1);
if(ret != FAILURE)
{
printf("Locate is %d\n", ret);
}
else
{
printf("Locate failure!\n");
}
ret = ListClear(list);
if(ret == SUCCESS)
{
printf("Clear success!\n");
}
else
{
printf("Clear failure!\n");
}
ret = ListTraverse(list);
ret = ListDestroy(&list);
if(ret == SUCCESS)
{
printf("Destroy success!\n");
}
else
{
printf("Destroy failure!\n");
}
return 0;
}
各个接口模块:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Linklist.h"
int ListInit(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(Node));//为头指针分配了一个地址
if((*L) == NULL)
{
return FAILURE;
}
(*L)->next = NULL;//头结点的指针域指向NULL
return SUCCESS;
}
int ListInsert(LinkList L, int k, int e)
{
if(NULL == L)
{
return FAILURE;
}
LinkList p = L;//定义一个指针指向头结点
LinkList l;//插入的结点
int j = 1;//计数器
while(p && j < k)
{
p = p->next;
j++;
}//把p移到k-1结点处
if(!p && j > k)
{
return FAILURE;
}
l = (LinkList)malloc(sizeof(Node));
if(NULL == l)
{
return FAILURE;
}
l->data = e;
l->next = p->next;
p->next = l;
return SUCCESS;
}
int ListLength(LinkList L)
{
if(NULL == L)
{
return FAILURE;
}
int length = 0;
LinkList p = L;
while(p->next)
{
length++;
p = p->next;
}
return length;
}
int ListTraverse(LinkList L)
{
if(NULL == L)
{
return FAILURE;
}
LinkList p = L;
while(p->next)
{
p = p->next;
printf("%d\n", p->data);
}
return SUCCESS;
}
int ListDelete(LinkList L, int k, int *e)
{
if(NULL == L)
{
return FAILURE;
}
LinkList p = L;
LinkList l = NULL;
int j = 1;
while(p->next && j < k)
{
p = p->next;
j++;
}
if(!(p->next) || j > k)
{
return FAILURE;
}
l = p->next;
*e = p->next->data;
p->next = p->next->next;
free(l);
return SUCCESS;
}
int ListLocate(LinkList L, int k)
{
if(NULL == L)
{
return FAILURE;
}
LinkList p = L;
int count = 0;
while(p->next)
{
p = p->next;
count++;
if(p->data == k)
break;
}
return count;
}
int ListClear(LinkList L)//清空链表,只剩下头结点
{
if(L == NULL)
{
return FAILURE;
}
LinkList p = L->next;
while(p)
{
L->next = p->next;
free(p);
p =L->next;
}
return SUCCESS;
}
int ListDestroy(LinkList *L)
{
free(*L);
*L = NULL;
return SUCCESS;
}