单链表的操作

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值