LinkList.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SUCCESS 10000
#define FAILURE 10001
typedef int ElemType;
struct Node
{
ElemType data;
struct Node *next;
};
typedef struct Node node;
typedef struct Node *pNode;
int InitLink(pNode *h);
int InsertLink(pNode h, int p, int num);
int TraverseLink(pNode h);
int GetElem(pNode h, int p);
int LocateElem(pNode h, int e);
int LengthLink(pNode h);
int PriorElem(pNode h, int num);
int NextElem(pNode h, int num);
void ReverseLink(pNode h);
int LinkDel(pNode h, int p);
int ClearLink(pNode h, int p);
int DestroyLink(pNode h, int p);
#endif
main.c
#include "LinkList.h"
int main()
{
srand(time(NULL));
pNode head = NULL; //定义头指针
int ret;
ret = InitLink(&head);
if (SUCCESS == ret)
{
printf("链表初始化成功!\n");
}
else
{
printf("链表初始化失败!\n");
}
int i, num;
for (i = 0; i < 5; i++)
{
num = rand() % 10;
ret = InsertLink(head, i + 1, num); //尾插法
//ret = InsertLink(head, 1, num); //头插法
if (FAILURE == ret)
{
printf("插入元素%d失败\n", num);
}
else
{
printf("插入元素%d成功\n", num);
}
}
TraverseLink(head);
int p = 6;
ret = GetElem(head, p); //获取指定位置的元素
if (FAILURE == ret)
{
printf("第%d个元素不存在\n", p);
}
else
{
printf("第%d个元素是%d\n", p, ret);
}
num = 6;
ret = LocateElem(head, num); //返回元素的位置
if (FAILURE == ret)
{
printf("元素%d不存在\n", num);
}
else
{
printf("元素%d是第%d个元素\n", num, ret);
}
printf("链表长度%d\n", LengthLink(head));
num = 4;
ret = PriorElem(head, num); //返回指定元素的前驱
if (FAILURE == ret)
{
printf("%d没有前驱\n", num);
}
else
{
printf("%d的前驱是%d\n", num, ret);
}
num = 3;
ret = NextElem(head, num);
if (FAILURE == ret)
{
printf("%d没有后继\n", num);
}
else
{
printf("%d后继是%d\n", num, ret);
}
ReverseLink(head);
TraverseLink(head);
for (i = 0; i < 3; i++)
{
p = rand() % 5; //随机产生一个位置
ret = LinkDel(head, p);
if (FAILURE == ret)
{
printf("删除第%d个元素失败\n", p);
}
else
{
printf("删除第%d个结点成功,元素是%d\n", p, ret);
}
}
ret = ClearLink(head);
if(FAILURE == ret)
{
printf("清空链表失败\n");
}
else
{
printf("清空链表成功\n");
}
TraverseLink(head);
ret = DestroyLink(head);
if(FAILURE == ret)
{
printf("销毁链表失败\n");
}
else
{
printf("销毁链表成功\n");
}
return 0;
}
LinkList.c
#include "LinkList.h"
int InitLink(pNode *h)
{
if (NULL == h)
{
return FAILURE;
}
*h = malloc(sizeof(node) * 1);
if (NULL == *h)
{
return FAILURE;
}
(*h)->next = NULL;
return SUCCESS;
}
int InsertLink(pNode h, int p, int num)
{
if (NULL == h)
{
return FAILURE;
}
pNode t = h;
int k = 1;
while (k < p && t != NULL) //把指针移动到要插入位置的前一个位置
{
t = t->next;
k++;
}
if (t == NULL || k > p) //p的值太大 p的值太小
{
return FAILURE;
}
pNode n = (pNode)malloc(sizeof(node) * 1);
if (NULL == n)
{
return FAILURE;
}
n->data = num;
n->next = t->next;
t->next = n;
return SUCCESS;
}
int TraverseLink(pNode h)
{
if (NULL == h)
return FAILURE;
pNode t = h->next; //指向第一个结点
while (t)
{
printf("%d ", t->data);
t = t->next;
}
printf("\n");
return SUCCESS;
}
int GetElem(pNode h, int p)
{
if (NULL == h)
return FAILURE;
if (p <= 0)
return FAILURE;
int k = 0;
pNode t = h;
while (k < p && t != NULL)
{
t = t->next;
k++;
}
if (!t) //if (t) ==== if (t != NULL) if (!t) ===== if (t == NULL)
{
return FAILURE; //p太大
}
return t->data;
}
int LocateElem(pNode h, int e)
{
if (NULL == h)
return FAILURE;
pNode t = h->next;
int i = 1;
while (t)
{
if (t->data == e)
{
return i;
}
i++;
t = t->next;
}
return FAILURE;
}
int LengthLink(pNode h)
{
if (NULL == h)
return FAILURE;
pNode t = h->next;
int i = 0;
while(t)
{
t = t->next;
i++;
}
return i;
}
int PriorElem(pNode h, int num)
{
if (NULL == h)
return FAILURE;
pNode t = h->next;
while (t->next)
{
if (num == t->next->data)
{
return t->data;
}
t = t->next;
}
return FAILURE;
}
int NextElem(pNode h, int num)
{
if (NULL == h)
return FAILURE;
pNode t = h->next;
while(t->next)
{
if(num == t->data)
{
return t->next->data;
}
t = t->next;
}
return FAILURE;
}
void ReverseLink(pNode h)
{
if (NULL == h)
return;
pNode p = h->next;
h->next = NULL;
while (p)
{
pNode q = p;
p = p->next;
q->next = h->next;
h->next = q;
}
}
int LinkDel(pNode h, int p)
{
if (NULL == h)
return FAILURE;
pNode t = h;
int k = 1;
while (k < p && t != NULL) //把指针移动到要插入位置的前一个位置
{
t = t->next;
k++;
}
if (t == NULL || k > p || !(t->next)) //p的值太大 p的值太小 无法删除最后的下一个结点
{
return FAILURE;
}
pNode n = t->next; //要删除的结点
int e = n->data;
t->next = n->next;
free(n);
return e;
}
int ClearLink(pNode h)
{
if(NULL == h)
return FAILURE;
pNode t = h->next;
while(t)
{
pNode n = t;
free(n);
t = t->next;
}
if(t == NULL)
{
h->next = NULL;
return SUCCESS;
}
return FAILURE;
}
int DestroyLink(pNode h)
{
if(NULL == h)
return FAILURE;
pNode t = h->next;
while(t)
{
pNode n = t;
free(n);
t = t->next;
}
if(t == NULL)
{
free(h);
return SUCCESS;
}
}