数据结构之链表的基本操作

链表的基本操作。
#include<iostream>
#include<cstring>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int ElemType;
typedef int Status;

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L){//建立一个空链表 
	L=new LNode;
	L->next=NULL;
	return OK;
}

Status InputList(LinkList &L,ElemType n){//前插法输入链表中的数据 
      LNode *p,*r;//LNode *p与LinkList p的作用是一样的 
      int i;
   //   L=new LNode;
      r=L;
      cout<<"请输入"<<n<<"个数字:"<<endl;
      for(i=0;i<n;i++){ //for(i=n-1;i>=0;i--)此为后插法 
         p=new LNode;
         cin>>p->data;
         p->next=NULL;
         r->next=p;
         r=p;
      }
    return OK;
}

Status GetNumber(LinkList L,int i,ElemType &num){//根据在链表中的位置搜索该位置的数值 
     LNode *p;
     int j;
     j=0;
     p=L->next;
     while(p&&j<i){
        p=p->next;
        ++j;
     }
     if(!p||j>i)
        return ERROR;
     num=p->data;
     return OK;
}

Status GetAdress(LinkList L,ElemType num){//根据所给的数值输出该数字在链表中的位置 
    LNode *p;
    int cas=1;
    p=L->next;
    while(p&&p->data!=num){
       p=p->next;//printf("right\n");
       ++cas;
       }
    return cas;
}

Status InsertList(LinkList &L,int i,ElemType &num){//在链表中进行插入操作 
      LNode *p,*s;
      int j=0;
      p=L;
      while(p&&j<i-1){
         p=p->next;
         ++j;
         }
      if(!p||j>i-1)
         return ERROR;
      s=new LNode;
      s->data=num;
      s->next=p->next;
      p->next=s;
      return OK;
}

Status DeleteList(LinkList &L,int i,ElemType &n){//删除链表中的数据 
      LNode *p,*q;
      p=L;
      int j=0;
      while(p->next&&j<i-1){
          p=p->next;
          ++j;
      //    cout<<"ERROR"<<endl; 
      }
      if(!(p->next)||j>i-1)
         return ERROR;
      q=p->next;
      p->next=q->next;
      n=q->data;
      delete q;
      return OK;
}
void OutputList(LinkList L){//输出链表中的数据 
	LinkList p;
	p=L->next;
	while(p){
//	cout<<ERROR;
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
//	return OK;
}

int main(){
	int temp,num_a,num_b,num_c,num_d;
	LinkList L;
	LinkList R;
	int num_deal,flag;
	cout<<"1. 建立链表\n";
	cout<<"2. 输入数据\n";
	cout<<"3. 按位置查找\n";
	cout<<"4. 按值查找\n";
	cout<<"5. 链表的插入\n";
	cout<<"6. 链表的删除\n";
	cout<<"7. 输出数据\n";
	cout<<"0. 退出\n\n";
	while(true){
		cout<<"请输入你的选项:"<<endl;
		cin>>temp;
		if(temp==0)
		   break;
		 flag=0;
		switch(temp){
			case 1:
				flag=InitList(L);
			   if(flag)
			      cout<<"链表建立成功!"<<endl;
			   else
			      cout<<"链表建立失败!"<<endl;
			  break;
		    case 2:
		    	int ans_fir;
		    	cout<<"请输入你想要输入的数据的个数:"<<endl;
		    	cin>>ans_fir;
		       	flag=InputList(L,ans_fir);
		       	if(flag)
		       	   cout<<"操作成功!"<<endl<<endl;
		       	else
		       	   cout<<"操作失败!"<<endl<<endl;
		       	  break;
		    case 3:
		    	int ans_sec;
		    	cout<<"请输入你所要查找的位置:"<<endl;
		    	cin>>ans_sec;
		    	flag=GetNumber(L,ans_sec-1,num_a);
		    	if(flag)
		    	   cout<<"你所要查找的位置的数字为"<<num_a<<endl<<endl;
		    	else
		    	   cout<<"搜索失败!"<<endl<<endl;
		    	  break;
		    case 4:
		    	int ans_thi;
				cout<<"请输入你所要查找的数字:"<<endl<<endl;
				cin>>ans_thi;
				flag=GetAdress(L,ans_thi);
				if(flag)
					cout<<"你所要查找的数字的位置为"<<flag<<endl<<endl;
				else
				    cout<<"查找失败!"<<endl;
				break;
		    case 5:
		    	int ans_for,ans_fif;
		    	cout<<"请输入你所要插入的位置和数字:"<<endl<<endl;
		    	cin>>ans_for>>ans_fif;
		    	flag=InsertList(L,ans_for,ans_fif);
		    	if(flag)
		    	   cout<<"插入成功!"<<endl<<endl;
		    	else
		    	   cout<<"插入失败!"<<endl<<endl;
		    	   break;
		    case 6:
		    	int ans_six;
		    	cout<<"请输入你所要删除的数字的位置:"<<endl<<endl;
		    	cin>>ans_six;
		    	flag=DeleteList(L,ans_six,num_c);
		    	if(flag)
		    	   cout<<"你所要删除的数字为:"<<num_c<<endl<<endl;
				else
				   cout<<"该数字无法删除!"<<endl<<endl; 
				break;
		    case 7:
		    	  OutputList(L);
                 break;
			default:
			    cout<<"操作不合法!"<<endl<<endl;
				break;		    	
	}
	}
	return 0;
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值