单链表

来源:互联网 发布:淘宝卖星巴克券货源 编辑:程序博客网 时间:2024/05/29 03:08
/*无意中翻看以前的日志,看到我先前的单链表程序,里面竟有许多错误。那会刚开始学习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__Htypedef 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为头的链表中,在末尾添加一个结点pNodebool InsertNode(Node *head,int i,DataType a);//在第i个位置插入a元素  后插入Node *FindNode(Node *head,DataType a);//查找元素a,成果返回a的结点,不成功返回NULLvoid 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为头的链表中,在末尾添加一个结点pNodeNode *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的结点,不成功返回NULLNode *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;}


原创粉丝点击