简单的链表程序:
头文件LinkList.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdlib.h>
#define FAILURE 10000
#define SUCCESS 10001
typedef int ElemType;
struct Node
{
ElemType date;
struct Node *next;
};
typedef struct Node Link;
typedef Link * pLink;
int InitLink(pLink *l);
int InsertLink(pLink *l, int p, ElemType e);
int TraverseLink(pLink *l, void (*p)(ElemType));
int EmptyLink(pLink l);
int LongLink(pLink l);
int GetElem(pLink l, int p);
int LocateElem(pLink l, ElemType e);
int LinkDelete(pLink *l, int p);
int LinkClear(pLink *l);
#endif
主函数main.c
#include <stdio.h>
#include "LinkList.h"
#include <time.h>
void print(ElemType e)
{
printf("%d ", e);
}
int main()
{
pLink link; //等效于struct Node *link
int ret;
ElemType e;
srand(time(NULL));
int i;
//初始化链表
ret = InitLink(&link);
if(SUCCESS == ret)
{
printf("InitLink Success!\n");
}
else
{
printf("InitLink Failure!\n");
}
//判断是否为空链表
ret = EmptyLink(link);
if(ret == FAILURE)
{
printf("Link is Empty!\n");
}
else
{
printf("Link is not Empty!\n");
}
//链表插入元素
for(i = 0; i < 8; i++)
{
e = rand() % 20;
ret = InsertLink(&link, i + 1, e);
if(ret == FAILURE)
{
printf("Insert %d Failure!\n", e);
}
else
{
printf("Insert %d Success!\n", e);
}
}
//遍历链表
ret = TraverseLink(&link, print);
if(ret == FAILURE)
{
printf("Traverse Failure!\n");
}
else
{
printf("Traverse Success!\n");
}
//判断是否为空链表
ret = EmptyLink(link);
if(ret == FAILURE)
{
printf("Link is Empty!\n");
}
else
{
printf("Link is not Empty!\n");
}
//求链表节点数
ret = LongLink(link);
if(ret == FAILURE)
{
printf("ERROR!\n");
}
else
{
printf("This Link have %d Node\n", ret);
}
//通过指定节点位置返回节点值
int p = 5;
ret = GetElem(link, p);
if(ret == FAILURE)
{
printf("ERROR!\n");
}
else
{
printf("%d-th Element is %d\n", p, ret);
}
//通过节点值返回节点位置
e = 10;
ret = LocateElem(link, e);
if(ret == FAILURE)
{
printf("No %d Element!\n", e);
}
else
{
printf("Element %d is %d-th.\n", e, ret);
}
//删除指定节点位置的值
p = 3;
ret = LinkDelete(&link, p);
if(ret == FAILURE)
{
printf("Delete Failure!\n");
}
else
{
printf("Delete %d-th %d Success!\n", p, ret);
}
//遍历链表
ret = TraverseLink(&link, print);
if(ret == FAILURE)
{
printf("Traverse Failure!\n");
}
else
{
printf("Traverse Success!\n");
}
//清空链表
ret = LinkClear(&link);
if(ret == FAILURE)
{
printf("Clear Failure!\n");
}
else
{
printf("Clear Success!\n");
}
//遍历链表
ret = TraverseLink(&link, print);
if(ret == FAILURE)
{
printf("Traverse Failure!\n");
}
else
{
printf("Traverse Success!\n");
}
return 0;
}
函数LinkList.c
#include "LinkList.h"
//初始化连表
int InitLink(pLink *l)
{
if(NULL == *l)
{
return FAILURE;
}
*l = (pLink)malloc(sizeof(Link) * 1);
if(NULL == *l)
{
return FAILURE;
}
(*l)->next = NULL;
return SUCCESS;
}
//链表插入函数
int InsertLink(pLink *l, int p, ElemType e)
{
if(NULL == *l)
{
return FAILURE;
}
int k = 1;
pLink q = *l;
while(k < p && q) //q != NULL
{
k++;
q = q->next;
}
if(!q || p <= 0) //!q: q == NULL
{
return FAILURE;
}
pLink n = (pLink)malloc(sizeof(Link) * 1);
if(NULL == n)
{
return FAILURE;
}
n->date = e;
n->next = q->next;
q->next = n;
return SUCCESS;
}
//遍历链表
int TraverseLink(pLink *l, void (*p)(ElemType))
{
if(NULL == *l)
{
return FAILURE;
}
pLink n = (*l)->next;
while(n)
{
p(n->date);
n = n->next;
}
return SUCCESS;
}
//判断链表是否为空
int EmptyLink(pLink l)
{
if(NULL == l)
{
return FAILURE;
}
if(l->next != NULL)
{
return SUCCESS;
}
return FAILURE;
}
//计算链表节点数
int LongLink(pLink l)
{
if(NULL == l)
{
return FAILURE;
}
int num = 0;
pLink p = l->next;
while(p)
{
p = p->next;
num++;
}
return num;
}
//指定位置返回值
int GetElem(pLink l, int p)
{
if(NULL == l)
{
return FAILURE;
}
pLink n = l;
int k = 1;
while(n != NULL && k < p)
{
n = n->next;
k++;
}
if(n->next == NULL || p<= 0)
{
return FAILURE;
}
pLink q = n->next;
return q->date;
}
//指定值返回位置
int LocateElem(pLink l, ElemType e)
{
if(NULL == l)
{
return FAILURE;
}
pLink n = l;
int k = 0;
while(n->next != NULL)
{
n = n->next;
k++;
if(n->date == e)
{
return k;
}
}
return FAILURE;
}
//链表删减
int LinkDelete(pLink *l, int p)
{
if(NULL == *l)
{
return FAILURE;
}
pLink n = *l;
int k = 1;
ElemType e;
while(k < p && n != NULL)
{
n = n->next;
k++;
} //循环结束后k = p,此时n指向p的前一个节点
if(n->next == NULL || p <= 0)
{
return FAILURE;
}
pLink q = n->next; //q指向p节点
e = q->date; //把p位置的值取出
n->next = q->next;
return e;
}
//链表清空
int LinkClear(pLink *l)
{
if(NULL == *l)
{
return FAILURE;
}
(*l)->next = NULL;
return SUCCESS;
}