1. 定义单链表的接口函数
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node * next;
}Node;
Node*InitNode();
bool AddNode(Node *head,ElemType data); //头插法
bool TailAddNode(Node *head,ElemType data); //尾插法
bool Display(Node *head); //打印链表
int GetNum(Node *head); //获取节点数
bool InsertNode(Node *head, int pos ,ElemType data);
bool DelNode(Node *head, int pos); //删除节点
void InversePrintList(Node *head); //反向打印链表
bool SortList(Node *head); //链表排序
bool ClearList(Node * *head); //清除链表
//递归实现链表逆置
bool ListInverse(Node *head);
void ReverseLinkList(Node *head);
#endif
2. 函数接口的实现:
#include "LinkList.h"
#include <stdio.h>
#include <malloc.h>
Node * InitNode()
{
Node * head = (Node *)malloc(sizeof(Node));
if(NULL == head)
return NULL;
head->data = -1;
head->next = NULL;
return head;
}
bool AddNode(Node * head,ElemType data)
{
if(NULL == head)
return false;
/*
Node * p = InitNode();
p->data =data;
p->next =head->next;
head->next =p;
*/
if(InsertNode(head,1,data))
return true;
else
return false;
}
bool TailAddNode(Node *head,ElemType data)
{
if(NULL == head)
return false;
int pos = GetNum(head)+1;
if(InsertNode(head,pos,data))
return true;
else
return false;
}
bool Display(Node * head)
{
if(NULL == head|| NULL == head->next )
return false;
Node * p =head->next;
do
{
printf("%d, ",p->data);
} while (p=p->next);
printf("\n");
return true;
}
int GetNum(Node * head)
{
if(NULL == head)
return -1;
Node * p =head;
int i =0;
while(p->next != NULL)
{
i++;
p= p->next;
}
return i;
}
bool InsertNode(Node * head, int n ,ElemType data)
{
if(NULL == head)
return false;
Node * p = head;
int i = GetNum(head);
if(n<1)
{
printf("链表的起始位置是1...\n");
return false;
}
//位置超过长度,则值为i+1,
if(n>i)
n= i+1;
for(int j = 1; j<n; j++)
p = p->next;
Node * q = InitNode();
q->data = data;
q->next = p->next;
p->next =q;
return true;
}
bool ClearList(Node * *head)
{
if(NULL == *head)
return false;
Node *p,*q;
p=(*head)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*head) = NULL; // 头结点指针为空
return true;
}
bool DelNode(Node * head, int n)
{
if(NULL == head || NULL == head->next)
return false;
Node * p = head;
int i = GetNum(head);
if(n<1 || n>i)
return false;
for(int j = 1; j<n; j++)
p = p->next;
Node * q = p->next;
p->next = q->next;
free(q);
q =NULL;
return true;
}
void InversePrintList(Node * head)
{
if(NULL == head)
return ;
else{
InversePrintList(head->next);
printf("%d, ",head->data);
}
}
//链表插入排序
bool SortList(Node * head)
{
if(!head->next)
return false;
Node * p,*q,*r,*u;
p =head->next; //分成2个链表
head->next=NULL;
while(p)
{
r=head;
q=head->next;
while(q != NULL && q->data <p->data)
{
r=q;
q=q->next;
}
u=p->next;
p->next =r->next;
r->next =p;
p=u;
}
return true;
}
//递归实现链表逆置
void ReverseLinkList(Node * head)
{
if (head->next== NULL)
return;
ReverseLinkList(head->next);
head->next->next =head;
head->next=NULL;
}
bool ListInverse(Node * head)
{
Node * rear = head;
while(rear->next != NULL)
{
rear = rear->next;
}
ReverseLinkList(head->next);
head->next =rear;
return true;
}
3. 测试文件:
#include "LinkList.h"
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
//1.创建头结点
Node * head = InitNode();
printf("当前节点数: %d\n",GetNum(head));
//2.添加节点
TailAddNode(head,20);
TailAddNode(head,40);
TailAddNode(head,90);
AddNode(head,17);
TailAddNode(head,48);
//3.打印
printf("创建链表:\n");
Display(head);
//4.获取节点数
printf("当前节点数: %d\n",GetNum(head));
//5.插入节点
InsertNode(head,1,15);
InsertNode(head,4,45);
printf("在位置1,4插入节点:\n");
Display(head);
//6.删除节点
DelNode(head,1);
printf("删除节点1:\n");
Display(head);
DelNode(head,4);
printf("删除节点4:\n");
Display(head);
//7.链表逆置
printf("链表逆置.......\n");
ListInverse(head);
Display(head);
//8.逆序打印
printf("逆序打印:\n");
InversePrintList(head->next);
//9.排序
SortList(head);
printf("\n排序.......\n");
Display(head);
//10.清空
ClearList(&head);
system("pause");
return 0;
}