linklist.c
#include "linklist.h"
int InitLink(Node **h)
{
if (NULL == h)
{
return FAILURE;
}
*h = (Node *)malloc(sizeof(Node) * 1);
if (NULL == *h)
{
return FAILURE;
}
(*h)->next = NULL;
return SUCCESS;
}
/*
函数描述:链表的插入操作
函数参数:链表头指针 插入的位置 插入的元素
函数返回值:插入成功返回SUCCESS 插入失败返回FAILURE
*/
int InsertLink(Node *h, int p, int e)
{
if (NULL == h)
{
return FAILURE;
}
Node *q = h;
int k = 1;
while (k < p && q) //把指针移动到要插入位置的前一个位置
{
q = q->next;
k++;
}
if (k > p || !q) //位置不合法
{
return FAILURE;
}
Node *n = (Node *)malloc(sizeof(Node) * 1);
if (NULL == n)
{
return FAILURE;
}
n->next = q->next;
n->data = e;
q->next = n;
return SUCCESS;
}
int TraverseLink(Node *h)
{
if (NULL == h)
{
return FAILURE;
}
Node *n = h->next;
while (n)
{
printf("%d ", n->data);
n = n->next;
}
printf("\n");
return SUCCESS;
}
int DelLink(Node *h, int p, int *e)
{
if(NULL == h)
{
return FAILURE;
}
Node *q = h;
int k = 1;
while (k < p && q)
{
k++;
q = q->next;
}
if (k > p || !q || q->next == NULL)
{
return FAILURE;
}
Node *n = q->next;
*e = n->data;
q->next = n->next;
free(n);
return SUCCESS;
}
/*
函数描述:获取指定位置的元素
函数参数:链表指针 位置 存放获取的元素
*/
int GetElem(Node *h, int p, int *e)
{
if (NULL == h)
{
return FAILURE;
}
Node *n = h;
int k = 0;
while (k < p && n)
{
n = n->next;
k++;
}
if (p <= 0 || !n)
{
return FAILURE;
}
*e = n->data;
return SUCCESS;
}
int LocateElem(Node *h, int num, int *p)
{
if (NULL == h || NULL == p)
{
return FAILURE;
}
Node *n = h->next;
int k = 1;
while (n)
{
if (n->data == num)
{
*p = k;
return SUCCESS;
}
k++;
n = n->next;
}
return FAILURE;
}
int ClearLink(Node *h)
{
if (NULL == h)
{
return FAILURE;
}
Node *n = h->next;
while (n)
{
h->next = n->next;
free(n);
n = h->next;
}
return SUCCESS;
}
int DestroyLink(Node **h)
{
if (NULL == h)
{
return FAILURE;
}
free(*h);
*h = NULL;
return SUCCESS;
}
int ReverseLink(Node *h)
{
if (NULL == h)
{
return FAILURE;
}
Node *p = h->next;
h->next = NULL;
while (p)
{
Node *q = p;
p = p->next;
q->next = h->next;
h->next = q;
}
return SUCCESS;
}
linklist.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 1000
#define FAILURE 1001
struct Node //表示结点信息
{
int data;
struct Node *next;
};
typedef struct Node Node;
int InitLink(Node **h);
int InsertLink(Node *h, int p, int e);
int TraverseLink(Node *h);
int DelLink(Node *h, int p, int *e);
int GetElem(Node *h, int p, int *e);
int LocateElem(Node *h, int num, int *p);
int ClearLink(Node *h);
int DestroyLink(Node **h);
int ReverseLink(Node *h);
#endif
main.c
#include "linklist.h"
int main()
{
Node *head = NULL; //定义头指针
int ret = InitLink(&head);
if (SUCCESS == ret)
{
printf("初始化成功!\n");
}
else
{
printf("初始化失败!\n");
}
int i;
for (i = 0; i < 10; i++)
{
ret = InsertLink(head, i + 1, i); //尾插法
//ret = InsertLink(head, 1, i); //头插法
if (SUCCESS == ret)
{
printf("第%d个位置插入%d成功!\n", i + 1, i);
}
else
{
printf("第%d个位置插入%d失败!\n", i + 1, i);
}
}
ret = InsertLink(head, 3, 100);
if (SUCCESS == ret)
{
printf("插入成功!\n");
}
else
{
printf("插入失败!\n");
}
TraverseLink(head);
ReverseLink(head);
TraverseLink(head);
int num;
int p = 12;
ret = DelLink(head, p, &num);
if (SUCCESS == ret)
{
printf("删除%d成功!\n", num);
}
else
{
printf("删除失败!\n");
}
TraverseLink(head);
p = 12;
ret = GetElem(head, p, &num);
if (SUCCESS == ret)
{
printf("第%d个位置元素是%d\n", p, num);
}
else
{
printf("获取第%d个元素失败!\n", p);
}
num = 5;
ret = LocateElem(head, num, &p);
if (SUCCESS == ret)
{
printf("元素%d位置是%d\n", num, p);
}
else
{
printf("元素%d不存在!\n", num);
}
ret = ClearLink(head);
if (SUCCESS == ret)
{
printf("清空成功!\n");
}
else
{
printf("清空失败!\n");
}
TraverseLink(head);
ret = DestroyLink(&head);
if (SUCCESS == ret)
{
printf("销毁成功!\n");
}
else
{
printf("销毁失败!\n");
}
for (i = 0; i < 10; i++)
{
ret = InsertLink(head, i + 1, i); //尾插法
//ret = InsertLink(head, 1, i); //头插法
if (SUCCESS == ret)
{
printf("第%d个位置插入%d成功!\n", i + 1, i);
}
else
{
printf("第%d个位置插入%d失败!\n", i + 1, i);
}
}
return 0;
}