没有单独编写头文件和测试函数,写在同一个文件中。详细解释在【复习笔记】
#include<stdio.h>
#include<stdlib.h>#define TURE 1
#define FALSE 0
typedef int data_t;
typedef struct LNode {
data_t data;
struct LNode *next;
}LNode, *LinkList;
LinkList CreateLinkList(void)
{
LinkList L = (LNode *)malloc(sizeof(LNode));
if(NULL == L)
{
return NULL;
}
L->next = NULL;
return L;
}
void ClearLinkList(LinkList L)
{
LinkList q;
while(L->next)
{
q = L->next;
L->next = q->next;
free(q);
}
q = NULL; //防止q变成野指针
}
int LengthLinkList(LinkList L)
{
int count = 0;
LinkList p = L->next;
while(p)
{
count ++;
p = p->next;
}
return count;
}
int IsEmpty(LinkList L)
{
#if 0
if(L->next)
{
return FALSE;
}
return TRUE;
#endif
#if 1
if(0 == LengthLinkList(L))
{
return TURE;
}
return FALSE;
#endif
}
LinkList LocateLinkList(LinkList L, data_t x)
{
LinkList p = L->next;
while(p)
{
if(x == p->data)
{
return p;
}
p = p->next;
}
return NULL;
}
LinkList FindLinkList(LinkList L, int i)
{
if(i<1 || i>LengthLinkList(L))
{
return NULL;
}
LinkList p = L->next;
int j;
for(j = 1; j < i; j ++)
{
p = p->next;
}
return p;
}
int InsertLinkList(LinkList L, data_t x, int i)
{
if(i<1 || i>(LengthLinkList(L)+1))
{
return FALSE;
}
LinkList p = L;
int j;
for(j = 1; j < i; j ++)
{
p = p->next;
}
LinkList Q = (LinkList)malloc(sizeof(LNode));
if(Q != NULL)
{
Q->data = x;
Q->next = NULL;
}
Q->next = p->next;
p->next = Q;
return TURE;
}
int DelLinkList(LinkList L, int i)
{
if(i<1 || i >LengthLinkList(L))
{
return FALSE;
}
LinkList p = L;
int j;
for(j = 1; j < i; j ++)
{
p = p->next;
}
LinkList q = p->next;
p->next = q->next;
q->next = NULL;
free(q);
return TURE;
}
void DisplayLinkList(LinkList L)
{
LinkList p = L->next;
while(p)
{
printf("%-d ", p->data);
p = p->next;
}
printf("\n");
}
void RevLinkList(LinkList L)
{
LinkList p, q = L->next;
L->next = NULL;
while(q)
{
p = q->next;
q->next = L->next;
L->next = q;
q = p;
}
}
LinkList MergeLinkList(LinkList L1, LinkList L2)
{
LinkList p1 = L1->next, p2 = L2->next;
LinkList r = L1;
free(L2);
while(p1 && p2)
{
if(p1->data > p2->data)
{
r->next = p2;
p2 = p2->next;
}
else
{
r->next = p1;
p1 = p1->next;
}
r = r->next;
}
if(p1)
{
r->next = p1;
}
if(p2)
{
r->next = p2;
}
return L1;
}
int main()
{
LinkList L1 = CreateLinkList();
LinkList L2 = CreateLinkList();
int i;
for(i = 1; i <= 5; i ++)
{
InsertLinkList(L1, i, i);
}
for(i = 1; i <= 10; i++ )
{
InsertLinkList(L2, i+2, i);
}
DisplayLinkList(L1);
DisplayLinkList(L2);
printf("isempty: %d\n",IsEmpty(L1));
DelLinkList(L2, 3);
DisplayLinkList(L2);
MergeLinkList(L1, L2);
DisplayLinkList(L1);
printf("length: %d\n", LengthLinkList(L1));
printf("L1(10): %p\n", FindLinkList(L1, 10));
printf("Locate L1(shi): %p\n", LocateLinkList(L1, 10));
RevLinkList(L1);
DisplayLinkList(L1);
ClearLinkList(L1);
DisplayLinkList(L1);
return 0;
}