定义一个单链表及相关操作

链表需要包含的操作有头插法建立链表、尾插法建立链表、在指定位置插入元素、打印链表、删除链表、寻找中间元素、单链表  1 // 定义一个链表及相关操作

  2 #include<iostream>
  3 using namespace std;
  4 
  5 struct LNode
  6 {
  7     int data;
  8     LNode *next;
  9 };
 10 
 11 class LinkList{
 12 public:
 13     LinkList(){head = new LNode;head->next=NULL};
 14     ~LinkList(){delete head;};
 15 
 16     void CreateF(int n); // 头插法建立链表
 17     void CreateR(int n); // 尾插法建立链表
 18 
 19     void Insert(int i,int _data); // 在指定位置插入链表
 20     void Output(); //打印链表
 21     void Clear(); // 删除链表
 22 
 23     LNode* findMid();  // 快速找到中间元素并返回其指针
 24     LNode *reverse(LNode* head); // 单链表逆置
 25 private:
 26     LNode *head;
 27 }
 28 
 29 
 30 void LinkList::CreateF(int n)
 31 {
 32     LNode *p;
 33     LNode *s;
 34     p = head;
 35 
 36     for(int i =0;i<n;++i){
 37         s = new LNode;
 38         cin>>s->data;
 39         s->next = p->next;
 40         p->next = s;
 41     }
 42 }
 43 
 44 void LinkList::CreateR(int n)
 45 {
 46     LNode *p;
 47     LNode *r;
 48     p = head;
 49     for(int i = 0;i<n;++i){
 50         r = new LNode;
 51         cin>>r->data;
 52         p->next = r;
 53         p = p->next;
 54     }
 55 }
 56 
 57 
 58 void LinkList::Insert(int i,int _data)
 59 {
 60     LNode *temp;
 61     temp = head;
 62     int j = 0;
 63     while(temp&&j<i-1){   // 找到i的位置
 64         temp = temp->next;
 65         j++;
 66     }
 67     if(!temp||j>i-1){
 68         cout<<"False!"<<endl;
 69     }else{
 70         LNode *s = new LNode;
 71         s->data = _data;
 72         s->next = temp->next;
 73         temp->next = s;
 74     }
 75 }
 76 
 77 void LinkList::Output()
 78 {
 79     LNode *p;
 80     p = head->next; // 注意不要写成p=head,因为头结点中没有保存数据
 81     while(p){
 82         cout<<p->data<<" ";
 83         p = p->next;
 84     }
 85 }
 86 
 87 void LinkList::Clear()
 88 {
 89     LNode *p,*q;
 90     p = head;
 91     while(p){
 92         q=p->next;
 93         delete p;
 94         p=q;
 95     }
 96     head->next = NULL;  //  这一步不能丢
 97 
 98 }
 99 
100 LNode* LinkList::findMid()
101 {
102     LNode *p,*q;
103     p=head;
104     q=head;
105     while(p!=NULL&&p2!=NULL){
106         p = p->next;
107         q = q->next->next;
108     }
109     return p;
110 }
111 
112 LNode* LinkList::reverse(LNode* head)
113 {
114     if(head==NULL||head->next==NULL)
115         return head;
116     LNode *_pre=NULL,*_next=NULL;
117 
118     while(head!=NULL){
119         _next = head->next;
120         head->next = _pre;
121         _pre = head;
122         head = _next;
123     }
124     return head;
125 }

 

posted @ 2018-09-25 16:02  朴者  阅读(2537)  评论(0编辑  收藏  举报