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