单链表基本操作

用单链表实现数据元素是整数的线性表,使其具有如下功能:
(1)初始化一个空表
(2)根据指定个数,逐个输入整数;
(3)根据给定的整数值进行查找,查找成功,返回此整数的在表中的位置,查找不成功,则输出查找失败;
(4)根据指定的位置可返回相应的整数;
(5)给定一个整数,插入到表中指定的位置;
(6)删除指定位置的整数;
(7)统计表中整数个数即求表长。
(8)逐个显示整数表中所有的整数;
下面展示一些 内联代码片

#include<stdio.h>
#include<iostream>
#include <stdlib.h> 
#define OK 1     //预定义常量及类型
#define ERROR 0 
#define OVERFLOW -1
typedef int Status; ;
typedef int ElemType;
using namespace std;
typedef struct LNode
{
	ElemType data;//数据域
	struct LNode *next;//指针域
}LNode,*LinkList;//*LinkList为LNode类型的指针
LinkList p,s,q,r;
 //1.构造一个空的单链表空
int InitList(LinkList &L) 
{ 
   L=new LNode;       //生成新结点作头结点用头指针L指向头结点   
   L->next=NULL;//头结点的指针域置空 
  printf("单链表初始化成功!\n");
  return OK;
   
} 
//2.单链表的建立(尾插法)
int CreateList(LinkList &L,int n)
{ //正位序输入n个元素的值,建立带表头结点的单链表L 
      L=new LNode; 
	  int i;
      L->next=NULL; 	
      r=L; 	   //尾指针r指向头结点 
      for(i=0;i<n;++i){ 
        p=new LNode;
		printf("请输入第%d个整数:",i+1);	
        cin>>p->data;   		//输入元素值 
        p->next=NULL; r->next=p; //将新结点*p插入尾结点*r之后
        r=p; 	//r指向新的尾结点 
      }
return OK; }//CreateList_R 




//3.在线性表L中查找值为e的数据元素
int LocateELem(LinkList L,ElemType e) 
{//返回L中值为e的数据元素的位置序号,查找失败返回0 
	int j;
  p=L->next; j=1;
  while(p &&p->data!=e)    //顺链域向后扫描,直到p为空或p所指结点的数据域等于e
        {p=p->next;  j++;}          		
  if(p)  
	  return j;   //p不为空,说明查找e成功,j即为e的序号
  else return 0; //p为空,说明查找e失败,返回0
} 

 //4.获取线性表L中的某个数据元素的内容
int GetElem(LinkList L,int i) 
{ 
	ElemType e;
	int j;
    p=L->next;j=1; //初始化
     while(p&&j<i){	//向后扫描,直到p指向第i个元素或p为空 
       p=p->next;   //p指向下一个结点
       ++j;   //计数器加1
     } 
     if(!p || j>i)return ERROR; // i值不合法,i<1或i>表长+1
     e=p->data; //取第i个元素 
     return e; 
}

//5.在L中第i个元素之前插入数据元素e 
Status ListInsert(LinkList &L,int i,ElemType e){ 
     p=L;
	 int j=0;
      while(p&&j<i-1){
		  p=p->next;
		  ++j;}	//寻找第i?1个结点 
      if(!p||j>i-1)return ERROR;	//i大于表长?+?1或者小于1  
      s=new LNode;			//生成新结点*s 
      s->data=e;      		           //将结点*s的数据域置为e 
      s->next=p->next;	   	        //将结点*s插入L中 
      p->next=s; //将结点*p的指针域指向结点*s 
      return OK; 
}

//6.将线性表L中第i个数据元素删除
 Status ListDelete(LinkList &L,int i){
	 int j;
	
    p=L;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; 	//改变删除结点前驱结点的指针域 
    delete q; 	//释放删除结点的空间 
 return OK; 
 }


int  ListLength(LinkList L)//7.求表长
//返回L中数据元素个数
{    LinkList p;
    int i;
    p=L->next;  //p指向第一个结点
     i=0;             
     while(p){//遍历单链表,统计结点数
           i++;
           p=p->next;    } 
    return i;                             
 }

void ListPrint(LinkList L) //	8.显示顺序表L中各元素
{
	
	
	while(L!=NULL){
		L = L->next;//下一节点
		printf("%5d", L->data);//当前节点
	
	}     
}
void main()
{
	LinkList L;//定义一个顺序表L
	int n,j=1,b,e,i;//要创建的顺序表的长度	
    int c=0,d=0;
	printf("\n");
	while(j)
  {
    printf("\n");
    printf("\n\t\t                线性表子系统            ");
    printf("\n\t\t************************************************");
    printf("\n\t\t*         1------初始化一个空表                *");
    printf("\n\t\t*         2------创建单链表,输入各整数值      *");
    printf("\n\t\t*         3------查找元素在表中的位置          *");
    printf("\n\t\t*         4------由位置查找整数                *");
    printf("\n\t\t*         5------插     入                     *");
    printf("\n\t\t*         6------删     除                     *");
    printf("\n\t\t*         7------求   表   长                  *");
    printf("\n\t\t*         8------显     示                     *");
    printf("\n\t\t*         0------返    回                      *");
    printf("\n\t\t************************************************");
    printf("\n\t\t  请选择菜单号(0--8):   ");
    scanf("%d",&b);

	
	switch(b)
	{
	case 1:
		c=InitList(L);
		break;
	case 2:
		if(	c==OK){
		printf("请输入单链表中整数的个数:");
        scanf("%d",&n);
        d=CreateList(L,n);
		break;
		}
		else
		{printf("请先进行初始化!");
		break;}
	case 3:
		if(	c==OK){
		printf("请输入要查整数:");
		scanf("%d",&e);
		if(LocateELem(L,e))
		printf("该数据是第%d个元素\n",LocateELem(L,e));
		else printf("查找失败,表中无此元素");}
		else
			  printf("请先进行初始化!");
		break;
		
	case 4:
		if(	c==OK){
		printf("请输入要查的整数的位置:");
        	scanf("%d",&i);
        if(GetElem(L,i)) 
			printf("该位置元素的内容是%d\n:",GetElem(L,i));
		else
			printf("查找失败,表中无此元素!\n");}
		else
			  printf("请先进行初始化!");
		break;
	case 5:
		if(	c==OK){
		printf("请输入要在第几个位置插入数据和数据的值");
		printf("\n输入格式:插入位置,整数(中间用逗号隔开)\n");
		scanf("%d,%d",&i,&e);
		if(ListInsert(L,i,e ))
			printf("插入成功!\n");}
		else
			  printf("请先进行初始化!");
		    break;
	case 6:
		if(	c==OK){
		printf("请输入要删除的位置:");
		scanf("%d",&i);
		ListDelete(L,i);}
		else
			  printf("请先进行初始化");
		break;
	case 7:
			if(	c!=OK)
			printf("\n\t\t 请先进行初始化! ");
			else
			printf("该单链表的表长为:%d\n",ListLength(L));
		break;
	case  8:
		if(	c!=OK)
			printf(" 请先进行初始化! ");
		
		else
		ListPrint(L);
		break;
	 case  0:
		    j=0;
		    break;
	    default:
		    printf(" 输入错误! 请重新输入!");
	}
  }
}

这个代码写了好长时间~~~啊啊啊,感觉可以的话点个赞哈,嘿嘿!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油吧!~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值