单链表各种操作(头插法建表、初始化、求表长、查找、删除、插入、取值)17计科班教学用

博客围绕单链表展开,重点提及单链表的插入和删除操作,插入采用头插法。这些操作在信息技术领域的数据结构处理中较为常见,对链表数据的管理和维护有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
typedef struct LNode
{
     ElemType   data;       //数据域
     struct LNode  *next;   //指针域
}LNode,*LinkList;  
//初始化链表 
Status InitList_L(LinkList &L){ 
L=new LNode;
L->next=NULL;
return OK;
} 
//求表长,返回L中数据元素个数
int  ListLength_L(LinkList L){
	int  i=0; 
    LinkList p;
    p=L->next;  //p指向第一个结点               
     while(p){//遍历单链表,统计结点数
           i++;
           p=p->next;    } 
    return i;                             
 }
//取值,获取线性表L中的某个数据元素的内容
Status GetElem_L(LinkList L,int i,ElemType &e){ 
    LNode *p=L->next;
	int j=1; //初始化
     while(p&&j<i){	//向后扫描,直到p指向第i个元素或p为空 
       p=p->next; ++j; 
     } 
     if(!p || j>i)return ERROR; //第i个元素不存在 
     e=p->data; //取第i个元素 
     return OK; 
}
//在线性表L中查找值为e的数据元素 
LNode *LocateELem_L(LinkList L,ElemType e) {
 //返回L中值为e的数据元素的地址,查找失败返回NULL
  LNode *p=L->next;
  while(p &&p->data!=e)  
        p=p->next;                		
  return p; 	
} 
//插入,在L中第i个元素之前插入数据元素e 
Status ListInsert_L(LinkList &L,int i,ElemType e){ 
      LNode *p=L;
	  int j=0; 
      while(p&&j<i-1){p=p->next;++j;}	//寻找第i-1个结点 
      if(!p||j>i-1)return ERROR;	//i大于表长n+1或者小于1  
      LinkList s;
	  s=new LNode;			//生成新结点s 
      s->data=e;      		           //将结点s的数据域置为e 
      s->next=p->next;	   	          //将结点s插入L中 
      p->next=s; 
      return OK; 
}//ListInsert_L 
//删除,将线性表L中第i个数据元素删除
 Status ListDelete_L(LinkList &L,int i){
    LNode *p=L;
    LNode *q;
	int j=0; 
    while(p->next &&j<i-1){                  //寻找第i个结点,并令p指向其前驱 
        p=p->next; ++j; 
    } 
    if(!(p->next)||j>i-1) return ERROR; //删除位置不合理 
    q=p->next;                                        //临时保存被删结点的地址以备释放 
    p->next=q->next; 	                  //改变删除结点前驱结点的指针域 
    //e=q->data; 	                                //保存删除结点的数据域 
    delete q; 	                                //释放删除结点的空间 
 return OK; 
}//ListDelete_L 
//前插法,建立单链表 
void CreateList_F(LinkList &L,int n){ 
      L=new LNode; 
      L->next=NULL; //先建立一个带头结点的单链表 
      LinkList p;
      for(int i=n;i>0;--i){ 
        p=new LNode; //生成新结点 
        cin>>p->data; //输入元素值 
        p->next=L->next;L->next=p; 	//插入到表头 
     } 
}//CreateList_F
//单链表元素输出 
void Out_LinkList(LNode *p){
	 printf("The Created LinkList Elem Is:");
	 while(p!=NULL)
	 {
	  cout<<p->data<<" "; 
	  p=p->next;
	 } 
}//Out_LinkList 
int main(){
	//第一步 初始化单链表
	 LinkList L;
	 LNode *p,*q,*Locate_Address;
	 int Init_flag,GetElem_flag;
	 int n=5;//建立单链表时需要创建节点的个数 
	 Init_flag=InitList_L(L);
	 if(Init_flag)
	 cout<<"Init OK!"<<endl;
	 else
	 cout<<"Init ERROR!"<<endl;
	//第二步 利用前插法建立单链表
	cout<<"Please Input The LinkList Elem_Value( "<<n<<" values):"<<endl;
	CreateList_F(L,n);
	cout<<"Create LinkList OK!"<<endl;
	Out_LinkList(L->next);//输出现有单链表中元素
	cout<<endl; 
	//第三步 单链表按照位置i取值
	int GetElem_i;
	ElemType GetElem_e;
	cout<<"Please Input The  GetElem_i: ";
	cin>>GetElem_i;
	GetElem_flag=GetElem_L(L,GetElem_i,GetElem_e);
	if(GetElem_flag)
	cout<<"GetElem Is OK:"<<GetElem_e<<endl;
	else
	cout<<"GetElem Is ERROR!"<<endl; 
    //第四步 单链表按值查找,如果找到返回地址,否则返回null 
    ElemType Locate_e;
	cout<<"Please input LocateElem value:"; 
	cin>>Locate_e;
    Locate_Address=LocateELem_L(L,Locate_e); 
    if(Locate_Address!=NULL)
    cout<<"LocateElem Is OK, The Address Is:"<<Locate_Address<<endl;
	else
	cout<<"LocateElem Is ERROR!"<<endl; 
	//第五步 单链表的插入操作
	ElemType ListInsert_e; 
	int ListInsert_i,ListInsert_flag;
	cout<<"Please Input The ListInsert_i:";
	cin>>ListInsert_i;
	cout<<"Please Input The ListInsert_e:";
	cin>>ListInsert_e;
	ListInsert_flag=ListInsert_L(L,ListInsert_i,ListInsert_e);
	if(ListInsert_flag)
	{
		cout<<"ListInsert Is OK!"<<endl;
		cout<<"The LinkList of Length is: "<<ListLength_L(L)<<endl;
		Out_LinkList(L->next);//输出现有单链表中元素	
	}
	else
	cout<<"ListInsert Is ERROR!"<<endl; 
	cout<<endl;
	//第六步 单链表删除操作
	int delete_i,delete_flag;
	cout<<"Please input The delete_i:";
	cin>>delete_i;
	delete_flag=ListDelete_L(L,delete_i);
	if(delete_flag)
	{
		cout<<"ListDelete is Ok!"<<endl;
		cout<<"The LinkList of length is: "<<ListLength_L(L)<<endl;
		Out_LinkList(L->next);//输出现有单链表中元素	
	}
	else
	cout<<"ListDelete Is ERROR!"<<endl;
	return OK;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值