单链表

/*无意中翻看以前的日志,看到我先前的单链表程序,里面竟有许多错误。那会刚开始学习C语言,对于指针和内存的操作介于半懂,但还是自以为是的认为自己写的不错。所以这次重新把链表写了一遍,不敢保证完全正确,只能说在前面的基础上提高。
攀登程序这座高峰,只能是越攀越高,从来没有到达顶峰的那一天。
tangwen 2010-12-31

*/

main.cpp

/*	==========================================

	Main.cpp
*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include "MyNode.h"

	void main()
{
	Node *h,*pNew;
	char e;
	h=(Node *)malloc(sizeof(Node));

	//创建一个链表
	printf("输入一串字符:");
	CreateNode(h);
	PrintNode(h);

	//链表逆序
	printf("链表逆序:\n");
	ReverseNode(h);
	PrintNode(h);

	//插入一个结点
	printf("插入结点:\n");
	InsertNode(h,3,'*');
	PrintNode(h);

	//删除一个结点
	printf("输入一个要删除的结点字符:");
	scanf("%c",&e);
	DeleteNode(h,e);
	PrintNode(h);

	//添加一个结点
	pNew=(Node *)malloc(sizeof(Node));
	printf("输入一个要添加的结点字符:");
	fflush(stdin);
	scanf("%c",&e);
	pNew->data=e;
	AddNode(h,pNew);
	PrintNode(h);

	DestroyNode(h);

}

MyNode.h

/*===========================================

	MyNode.h
*/
#ifndef __MYNODE_H
#define __MYNODE__H



	typedef char DataType;


typedef struct Node
{
	DataType data;
	struct Node *next;
}Node,*LPNODE;


void CreateNode(Node *head);
void PrintNode(Node *head);
bool DeleteNode(Node *head,DataType key);
void AddNode(Node *head,Node *pNode);//在以head为头的链表中,在末尾添加一个结点pNode
bool InsertNode(Node *head,int i,DataType a);//在第i个位置插入a元素  后插入
Node *FindNode(Node *head,DataType a);//查找元素a,成果返回a的结点,不成功返回NULL
void ReverseNode(Node *head);//链表逆序
void DestroyNode(LPNODE head);


#endif

MyNode.cpp

/*
==============================================

	MyNode.cpp
*/

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include "MyNode.h"


	///////////////////////////////////////////////////////////////////

void CreateNode(Node *head)
{//以head为头创建一个链表
	Node *p,*p1;
	char a;
	p1=head;
	p1->next=NULL;
	a=getchar();
	while((a!='\n'))
	{
		p=(Node *)malloc(sizeof(Node));
		p->data=a;
		p1->next=p;
		p->next=NULL;
		p1=p;
		a=getchar();
	}
}


void PrintNode(Node *head)
{//输出链表元素
	Node *p;
	p=head->next;
	while(p!=NULL)
	{
		printf("%c\t",p->data);
		p=p->next;
	}
	printf("\n\n");
}

bool DeleteNode(Node *head,DataType key)
{//删除一个a元素所在的结点
	Node *h,*p;
	h = head;
	p = h->next;
	while(p!=NULL)
	{
		if(p->data==key)
		{
			h->next = p->next;
			free(p);
			p = NULL;
			break;
		}
		h = p;
		p = h->next;
	}
	return true;
}

void AddNode(Node *head,Node *pNode)
{//在以head为头的链表中,在末尾添加一个结点pNode
	Node *p;
	p=head->next;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	p->next=pNode;
	pNode->next=NULL;
}

bool InsertNode(Node *head,int i,DataType a)//后面插入
{//在第i个位置插入a元素
	Node *p,*pn;
	int n=1;
	p=head->next;
	pn=NULL;
	while(p!=NULL)
	{
		if(n==i)
		{
			pn=(Node *)malloc(sizeof(Node));
			pn->data=a;
			//判断插入的结点是否在尾结点
			if(p->next!=NULL)
			{
				pn->next=p->next;
				p->next=pn;
			}
			else
			{
				p->next=pn;
				pn->next=NULL;
			}
			break;
		}
		n++;
		p=p->next;
	}

	if(pn==NULL) return false;
	else return true;
}

Node *FindNode(Node *head,DataType a)
{//查找元素a,成果返回a的结点,不成功返回NULL
	Node *p,*pn;
	pn=NULL;
	p=head->next;
	while(p!=NULL)
	{
		if(p->data==a)
		{
			pn=p;
			break;
		}
		p=p->next;
	}
	return pn;
}


void ReverseNode(Node *head)//链表逆序
{
	Node *p,*pn,*pm;
	p=head->next;
	pm=p->next;
	p->next=NULL;
	pn=p;
	while(pm!=NULL)
	{
		p=pm;
		pm=p->next;//保存下一个结点的地址
		p->next=pn;
		head->next=p;
		pn=p;//pn永远指向head->next
	}
}

void DestroyNode(LPNODE head)
{//释放整条链表
	LPNODE h,p;
	h = head;
	p = h->next;
	while(p->next!=NULL)
	{
		free(h);
		h = p;
		p = h->next;
	}
	free(p);
	p = NULL;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值