用单链表实现数据元素是整数的线性表,使其具有如下功能:
(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(" 输入错误! 请重新输入!");
}
}
}
这个代码写了好长时间~~~啊啊啊,感觉可以的话点个赞哈,嘿嘿!