LinkList.h
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
/*线性表的单链表存储结构*/
typedef struct Node
{
ElemType data;
struct Node *next;
}node;
typedef struct Node *LinkList;
Status InitLink(LinkList L);/*初始化单链表*/
Status CreateLink(LinkList L, int n);/*单链表的整表创建*/
int LengthLink(LinkList L);/*求单链表的长度*/
Status GetElem(LinkList L, int i, ElemType *e);/*得到单链表的元素*/
Status LinkInsert(LinkList L, int i, ElemType e);/*单链表的插入*/
Status LinkDelete(LinkList L, int i, ElemType *e);/*单链表的删除*/
Status PrintLink(LinkList L);/*打印单链表*/
Status ClearLink(LinkList L);/*单链表的整表删除*/
Status NixuLink(LinkList L);/*单链表的逆序*/
Linklist.c
#include "LinkList.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
Status InitLink(LinkList L)
{
L = (LinkList)malloc(sizeof(node));
if(!L)
{
return ERROR;
}
memset(L, 0, sizeof(node));
L->next = NULL;
return OK;
}
Status CreateLink(LinkList L, int n)
{
int i = 0;
LinkList r = NULL, p = NULL;
InitLink(L);
r = L;
for(i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(node));
if(!p)
{
return ERROR;
}
memset(p, 0, sizeof(node));
p->data = i+1;
r->next = p;
r = p;
}
r->next = NULL;
return OK;
}
int LengthLink(LinkList L)
{
LinkList r = L;
int len = 0;
while(r->next)
{
r=r->next;
len++;
}
return len;
}
Status GetElem(LinkList L, int i, ElemType *e)
{
int j = 0;
LinkList r = L;
while(r->next && j<i)
{
r = r->next;
j++;
}
if(!r || i<1)
{
return ERROR;
}
*e = r->data;
return OK;
}
Status LinkInsert(LinkList L, int i, ElemType e)
{
int j = 0;
LinkList r = NULL, p = NULL;
r = L;
if(i<1 || i>LengthLink(L)+1)
{
return ERROR;
}
for(j=1; j<i; j++)
{
r = r->next;
}
p = (LinkList)malloc(sizeof(node));
if(!p)
{
return ERROR;
}
memset(p, 0, sizeof(node));
p->data = e;
p->next = r->next;
r->next = p;
return OK;
}
Status LinkDelete(LinkList L, int i, ElemType *e)
{
int j = 0;
LinkList r = NULL, p = NULL;
r = L;
if(i<1 || i>LengthLink(L))
{
return ERROR;
}
for(j=1; j<i; j++)
{
r = r->next;
}
p = r->next;
*e = p->data;
r->next = p->next;
free(p);
}
Status ClearLink(LinkList L)
{
LinkList r = NULL, p = NULL;
r = L->next;
while(r)
{
p = r->next;
free(r);
r = p;
}
L->next = NULL;
return OK;
}
Status PrintLink(LinkList L)
{
LinkList r = L;
while(r->next)
{
r = r->next;
printf("%d ", r->data);
}
printf("\n");
}
/*循环迭代逆序*/
Status NixuLink(LinkList L)
{
/*通过三个指针来实现*/
static LinkList prev = NULL;
LinkList head = NULL, next = NULL;
head = L->next;
//next = head->next;
L->next = NULL;
while(head)
{
next = head->next;
head->next = prev;
prev = head;
head = next;
}
/*
while(prev)
{
printf("%d ", prev->data);
prev = prev->next;
}
printf("\n");
*/
L->next = prev;
//printf("%d\n", L->next->next->data);
return OK;
}