单链表的C++简单实现(包含创建,插入,删除,打印等基本操作)

#include<iostream>
#define _LinkList_
using namespace std;

typedef struct Lnode
{
 char data;
 struct Lnode *next;
}LN;

LN *CreateLinkList()
{
 LN *head,*p,*pre;
 char ch;
 int i=1;
 head=(LN *)malloc(sizeof(LN));
 head->next=NULL;
 pre=head;
 while(1)
 {
  cout<<"输入第"<<i<<"个节点数据:";
  while((ch=cin.get())!='\n')
  {
  cin.get();
  p=(LN *)malloc(sizeof(LN));
  pre->next=p;
  p->next=NULL;
  p->data=ch;
  pre=p;
  i++;
  break;
  }
  if(ch=='\n')
     break;
 }
  p->next=NULL;
 return head;
}


int LinkListLength(LN *head)
{
 int count=1;
 LN *p;
 p=head->next;
 while(p->next)
 {
  p=p->next;
  count++;
 }
 return count;
}

void SearchData(int i,LN *head)
{
 LN *p;
 int j=0;
 p=head->next;
 cout<<"输入要查找的节点:";
 cin>>i;
 while(p&&j<i-1)
 {
  p=p->next;
  j++;
 }
  if(!p)
 {
  cout<<"该节点不存在!"<<endl;
 }

 else
 {
 cout<<"该节点数据为:"<<p->data<<endl;
 }
}


LN *InsertData(int i,LN *head)
{
 LN *p,*insert;
 int j=1;
 char ch;
 cout<<"输入要插入的数据:";
 cin>>ch;
 cout<<"输入元素插入的位置:";
 cin>>i;
 if(i>LinkListLength(head))
 {
  cout<<"插入错误!"<<endl;
  return NULL;
 }
 else if(i==1)
 {
  insert=(LN *)malloc(sizeof(LN));
  insert->next=head->next;
  head->next=insert;
  insert->data=ch;
  return head;
 }
 else
 {
 p=head->next;
 while(p&&j<i-1)
 {
  p=p->next;
  j++;
 }
 insert=(LN *)malloc(sizeof(LN));
 insert->data=ch;
 insert->next=p->next;
 p->next=insert;
 return head;
 }
}


LN *DeleteData(int i,LN *head)
{
 LN *p,*q;
 int j=0;
 cout<<"输入要删除的节点位置:";
 cin>>i;
 if(i>LinkListLength(head))
 {
  cout<<"该节点不存在,删除失败!"<<endl;
  return NULL;
 }
 
 else
 {
 q=head;
 while(q&&j<i)
 {
  p=q;
  q=q->next;
  j++;
 }
 
 p->next=q->next;
 free(q);
 return head;
 }
}

void AddDataToTail(LN *head)
{
 LN *p,*add;
 char ch;
 cout<<"输入要追加的数据:";
 cin>>ch;
 p=head;
 while(p->next)
 {
  p=p->next;
 }
 add=(LN *)malloc(sizeof(LN));
 add->data=ch;
 p->next=add;
 add->next=NULL;
 cout<<"数据追加成功!"<<endl;
}


void PrintLinkList(LN *head)
{
 LN *p;
 p=head->next;
 cout<<"链表序列为:";
 while(p->next)
 {
  cout<<p->data<<"-->";
  p=p->next;
 }
 cout<<p->data<<endl;
}


LN * FindMin(LN * head)
{
 LN *p,*minptr;
 char min;
 p=head->next;
 minptr=p;
 min=minptr->data;
 while(p!=NULL)
 {
  if(p->data<min)
  {
   minptr=p;
   min=p->data;
  }
  p=p->next;
 }
 return minptr;
}


LN * DeleteSpecificData(char ch,LN * head)
{
 LN *p,*q;
 int j=0;
 q=head->next;
 while(q&&q->data!=ch)
 {
  p=q;
  q=q->next;
 }
 if(q==NULL)
 {
  cout<<"数据不存在,删除失败!"<<endl;
  return NULL;
 }
 else
 {
 p->next=q->next;
 free(q);
 return head;
 }
}

int main()
{
 int n=0;
 int choice;
 char ch;
 LN *head,*head1,*head2,*result;
 head=CreateLinkList();
 if(head!=NULL)
 {
  cout<<"单链表head创建成功!"<<endl;
 }
 while(1)
 {
     system("pause");
  system("cls");
 cout<<"1.查找数据"<<endl;
 cout<<"2.插入数据"<<endl;
 cout<<"3.删除指定节点数据"<<endl;
 cout<<"4.链表长度"<<endl;
 cout<<"5.追加数据"<<endl;
 cout<<"6.打印链表"<<endl;
 cout<<"7.查找最小数据"<<endl;
 cout<<"9.删除指定数据"<<endl;
 cout<<"10.退出程序"<<endl;
 cout<<"请选择操作:";
 cin>>choice;
 switch(choice)
 {
 case 1: SearchData(n,head);break;
    case 2: result=InsertData(n,head);
  if(result)
  {
         cout<<"数据插入成功!"<<endl;
  }break;
 case 3: result=DeleteData(n,head);
  if(result)
  {
   cout<<"数据删除成功!"<<endl;
  }break;
 case 4: cout<<"链表长度为:"<<LinkListLength(head)<<endl;break;
 case 5: AddDataToTail(head);break;
 case 6: PrintLinkList(head);break;
 case 7:result=FindMin(head);cout<<"最小数据:"<<result->data<<endl;break;
 case 9:cout<<"输入要删除的数据:"<<endl;cin>>ch;result=DeleteSpecificData(ch,head);
  if(result)
  {
   cout<<"该数据删除成功!"<<endl;
  }break;
 case 10: exit(0);
 default:cout<<"输入错误!"<<endl;break;
 }

 }

return 0;

}

 转载请注明出处

猜你喜欢

转载自www.cnblogs.com/lyj-blogs/p/SingleList.html