单链表基本操作

 

//C++版

#include<iostream>

using namespace std;

class LinkNode

{

public:

   int data;

   LinkNode *next;

   LinkNode(int d = 0):data(d),next(NULL){}

};

class LinkList

{

private:

   LinkNode *head;

public:

   LinkList(){head = new LinkNode();}

   ~LinkList();

   void clear();

   int GetLength();

   void InsertFirst(int d);

   void InsertLast(int d);

   void Insert(int index, int d);

   int GetFirst();

   int GetLast();

   int GetElement(int index);

   int IndexOf(int d);

   void RemoveFirst(int d);//删除第一个值为d的节点

   void RemoveAll(int d);//删除所有值为d的节点

   void UpdateAll(int d,int e);//将所有值为d的替换为e

   void Output();

};

LinkList::~LinkList()

{

   LinkNode *p = head;

   while(p != NULL)

   {

      head = head->next;

      delete p;

      p = head;

   }

}

void LinkList::clear()

{

   LinkNode *p = head->next,*q;

   while(p != NULL)

   {

      q = p;

      p = p->next;

      delete q;

   }

   head->next = NULL;

}

int LinkList::GetLength()

{

   int i = 0;

   LinkNode *p = head->next;

   while(p != NULL)

   {

      i++;

      p = p->next;

   }

   return i;

}

void LinkList::InsertLast(int d)

{

   LinkNode *p = head;

   LinkNode *q = new LinkNode(d);

   while(p->next != NULL)

      p = p->next;

   p->next = q;

}

void LinkList::InsertFirst(int d)

{

   LinkNode *p = new LinkNode(d);

   p->next = head->next;

   head->next = p;

}

void LinkList::Insert(int index, int d)

{

   if(index < 1 || index >GetLength()+1)

   {

      cout<<"invalid index"<<index;

      return;

   }

   LinkNode *p = head;

   LinkNode *q = new LinkNode(d);

   int i = 1;

   while(i < index)

   {

      p = p->next;

      i++;

   }

   q->next = p->next;

   p->next = q;

}

int LinkList::GetFirst()

{

   if(head->next == NULL)

   {

      cout<<"this is an empty LinkList"<<endl;

      return -1;

   }

   else

      return head->next->data;

}

int LinkList::GetLast()

{

   if(head->next == NULL)

   {

      cout<<"this is an empty LinkList"<<endl;

      return -1;

   }

   LinkNode *p = head->next;

   while(p->next != NULL)

      p = p->next;

   return p->data;

}

int LinkList::GetElement(int index)

{

   if(index < 1 || index > GetLength()+1)

   {

      cout<<"invalid index"<<index;

      throw "error";

   }

   LinkNode *p = head->next;

   int i = 1;

   while(i < index)

   {

      p = p->next;

      i++;

   }

   return p->data;

}

int LinkList::IndexOf(int d)

{

   LinkNode *p = head->next;

   int i = 1;

   while(p != NULL && p->data != d)

   {

      i++;

      p = p->next;

   }

   if(p == NULL)

      return 0;

   else return i;

}

void LinkList::RemoveFirst(int d)

{

   LinkNode *p = head,*q;

   while(p != NULL && p->next != NULL)

   {

      if(p->next->data == d)

      {

        q = p->next;

        p->next = q->next;

        delete q;

        return;

      }

      p = p->next;

   }

}

void LinkList::RemoveAll(int d)

{

   LinkNode *p = head,*q;

   while(p != NULL && p->next != NULL)

   {

      if(p->next->data == d)

      {

        q = p->next;

        p ->next = q->next;

        delete q;

      }

      p = p->next;

   }

}

void LinkList::UpdateAll(int d, int e)

{

   LinkNode *p = head->next;

   while(p != NULL)

   {

      if(p->data == d)

        p->data = e;

      p = p->next;

   }

}

 

void LinkList::Output()

{

   LinkNode *p = head->next;

   int i = 0;

   while(p != NULL)

   {

      cout<<p->data<<"\t";

      p = p->next;

      i++;

      if(i%5 == 0)  cout<<endl;

   }

}

int main()

{

   LinkList l;

   for(int i = 1; i<=20; i++)

   {

      l.Insert(i,i);

   }

   l.Insert(6,3);

   l.Output();

   cout<<endl;

   l.UpdateAll(3,0);

   l.Output();

   return 1;

}

 

// ----------------------------------------------------------------------------------------------------

C语言版

#include<iostream>

using namespace std;

 

typedef struct Node//节点类型定义

{

   int data;

   struct Node *next;

}LNode,*LinkList;//LinkList为结构指针类型

void InitList(LinkList &);

LinkList LinkListCreate();

void Insert(LinkList &,int,int);

void Delete(LinkList &,int);

void DelHead(LinkList &);//删除第一个节点

int FindFirst(LinkList,int);//查找第一个值为x的节点,返回其位置

void Reverse(LinkList &);

void Sort(LinkList &);

int GetLength(LinkList);

void Output(LinkList);

void InitList(LinkList &l)

{

   LinkList head;

   head = (LinkList)malloc(sizeof(LNode));

   head->next = NULL;

   l = head;

}

LinkList LinkListCreate()

{

   LinkList head,p,q;

   head = (LinkList)malloc(sizeof(LNode));

   p = head;

   int number;

   cout<<"输入数据,按ctrl+z结束:"<<endl;

   while(cin>>number)

   {

      q = (LinkList)malloc(sizeof(LNode));

      q->data = number;

      p->next = q;

      p = p->next;

   }

   p->next = NULL;

   return head;

}

void Insert(LinkList &l,int index,int num)

{

   if(index < 1 || index > GetLength(l)+1)

   {

      cout<<"Invalid index"<<endl;

      return;

   }

   int i = 1;

   LinkList p = l,q;

   while(i < index)

   {

      p = p->next;

      i++;

   }

   q = (LinkList)malloc(sizeof(LNode));

   q->data = num;

   q->next = p->next;

   p->next = q;

}

 

void Delete(LinkList &l,int num)

{

   LinkList p = l,q;

   while(p && p->next != NULL)

   {

      if(p->next->data == num)

      {

        q = p->next;

        p->next = q->next;

        free(q);

      }

      p = p->next;

   }

}

void DelHead(LinkList &l)

{

   LinkList p;

   p = l->next;

   l->next = p->next;

   free(p);

}//删除第一个节点

int FindFirst(LinkList l,int d)

{

   LinkList p = l->next;

   int i = 1;

   while(p != NULL && p->data != d)

   {

       i++;

       p = p->next;

   }

   if(p == NULL)  return 0;

   else return i;

}

void Reverse(LinkList& l)

{

   LinkList p = l->next,q,r;

   l->next = NULL;

   while(p != NULL)

   {

      r = p;

      p = p->next;

      r->next = l->next;

      l->next = r;

   }

}

 

void Sort(LinkList &l)

{

   LinkList p = l->next,q,r;

   l->next = NULL;

   while( p != NULL)

   {

      r = p;

      p = p->next;

      q = l;

      while( q->next && q->next->data < r->data)

        q = q->next;

      r->next = q->next;

      q->next = r;

   }

}

int GetLength(LinkList l)

{

   LinkList p = l->next;

   int i = 0;

   while(p != NULL)

   {

      p = p->next;

      i++;

   }

   return i;

}

void Output(LinkList l)

{

   LinkList p = l->next;

   int i = 0;

   while(p != NULL)

   {

      cout<<p->data<<"\t";

      p = p->next;

      i++;

      if(i%5 == 0)

        cout<<endl;

   }

}

int main()

{

   LinkList l;

   l = LinkListCreate();

   cout<<GetLength(l)<<endl;

   Insert(l,3,0);

   Delete(l,0);

   DelHead(l);

   Reverse(l);

   //Sort(l);

   Output(l);

   return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值