单链表是学习数据结构的基础,一些简单的操作还是要熟练掌握
头文件list.h
//list.h #include "stdio.h" #include "stdlib.h" #include "malloc.h" #include <iostream> using namespace std; //定义节点结构体 typedef struct LNode { int data; struct LNode * next; }LNode,*LinkList; //函数声明 LinkList LinkListInit(); void showmeu(); void CreateList(LNode *); void printList(LNode *); void addNode(LNode *); void deleteNode(LNode *); void searchNode(LNode *); void reverList(LNode *); void select(LNode *);
源文件
//list.cpp #include "list.h" //list practice //main函数 int main() { LinkList head=LinkListInit(); select(head); return 0; } //链表初始化 LinkList LinkListInit() { LinkList pHead; pHead=(LinkList)malloc(sizeof(LNode)); if(pHead==NULL) { cout<<"初始化失败!"; exit(-1); } //初始化成功 cout<<"初始化链表成功!"<<endl; pHead->next=NULL; return pHead; } void showmeu() { cout<<endl<<"***************菜单,选择操作**********************"<<endl; cout<<"1.新建链表"<<endl; cout<<"2.遍历链表"<<endl; cout<<"3.添加节点"<<endl; cout<<"4.删除节点"<<endl; cout<<"5.查找节点"<<endl; cout<<"6.逆序链表"<<endl; cout<<"7.退出"<<endl; cout<<"******************************************************"<<endl; } void select(LNode *head) { int selection; while(1) { // system("cls");//清屏 showmeu(); cout<<endl<<"请选择你的操作:"; cin>>selection; switch(selection) { case 1: CreateList(head);break; case 2: printList(head);break; case 3: addNode(head);break; case 4: deleteNode(head);break; case 5: searchNode(head);break; case 6: reverList(head);break; case 7: exit(-1); } } } //创建链表 void CreateList(LNode * head) { int n; int x; LinkList p=head; cout<<"请输入节点个数:"; cin>>n; if(n<=0) exit(-1); for(int i=1;i<=n;i++) { LinkList q=(LinkList )malloc(sizeof(LNode)); cout<<"请输入第"<<i<<"个节点值:"; cin>>x; q->data=x; q->next=NULL; //关键的两句,用尾插法 p->next=q; p=q; } cout<<"创建链表成功!"<<endl; } //遍历链表 void printList(LNode * head) { LinkList p=head->next; if(p==NULL) cout<<"该链表还没有节点元素"<<endl; cout<<"遍历的结果是:"<<endl; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } } int getlistlong(LNode * head) { LinkList p=head->next; int n=0; if(p==NULL) return 0; while(p!=NULL) { n++; p=p->next; } return n; } //插入节点 void addNode(LNode * head) { int n; int x; int length=getlistlong(head); if(head==NULL) cout<<"请先创建头节点"<<endl; else { cout<<"请输入要插入的位置:"; cin>>n; if(n>length) { cout<<"因为要插入的位置比最后的位置还要大,已经为你插入到最后的位置"<<endl; n=length+1; } if(n<=0) cout<<"请输入大于0的位置"<<endl; cout<<"请输入要插入的值:"; cin>>x; LinkList p=(LinkList)malloc(sizeof(LNode)); p->data=x; LinkList q=head; for(int i=1;i<n;i++) { q=q->next; } p->next=q->next; q->next=p; cout<<"插入成功!"<<endl; } } //删除节点 void deleteNode(LNode * head) { LinkList p; //要删除的元素 int n; if(head==NULL || head->next==NULL) cout<<"链表为空或长度为0,不能删除链表"<<endl; else { cout<<"请输入要删除的位置:"; cin>>n; if(n<=0) cout<<"链表为空或长度为0,不能删除链表"<<endl; else { LinkList q=head; for(int i=1;i<n;i++) { q=q->next; } p=q->next; q->next=q->next->next; cout<<"删除的元素是:"<<p->data<<endl; } } } //查找节点 void searchNode(LNode * head) { LinkList p=head; int n=0; int x; cout<<"输入你要寻找的节点:"; cin>>x; if(head==NULL || head->next==NULL) //若头节点为空,或后面也指向一个空的节点 cout<<"链表为空,没有你要找的节点:"<<endl; else { while(p->next!=NULL) { if(p->data==x) { cout<<"找到你要找的节点的位置了,它在"<<n<<"个位置"<<endl; break; } else { p=p->next; n++; } if(p==NULL) cout<<"没有找到你要的这个节点!"<<endl; } } } //链表逆序 void reverList(LNode * head) { LinkList p=NULL; LinkList q=NULL; if(head == NULL) { cout<<"链表为空,不需逆序!"<<endl; } p=head->next; while(p->next != NULL) { q=p->next; p->next=q->next; q->next=head->next; head->next=q; } cout<<"逆序成功,现在的链表的顺序是:"<<endl; printList(head); }
运行结果:
单链表的基本操作(初始化,建表,遍历,增加,删除,查找,逆序)等操作
原文:http://my.oschina.net/lvguidong/blog/520141