数据结构单链表的一系列操作

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<conio.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef int status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;//结构体指针 
}LNode,*LinkList;//同一结构体指针的两个名字
//初始化
status InitList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));  //生成新指针作为新结点,头指针指向头结点 
L->next=NULL;//头结点的指针域为空 
cout<<"创建链表成功!"<<endl; 
return OK;

//取值
//取第i位元素的值e 
status GetElem(LinkList L,int i,int &e){
LNode *p;
int j=1;
p=L->next;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i){
return ERROR;
}
e=p->data;
cout<<"查找元素["<<i<<":"<<e<<"]"<<endl;
return OK;

//查找
LNode *LocateElem(LinkList L,int e){
LNode *p;
p=L->next;
//顺链向后扫描知道p为空或是p所指结点的值为e 
while(p&&p->data!=e){
p=p->next;
}
//查找成功返回值为e的结点,查找失败p为NULL 
if(p){
cout<<"查找成功!"<<endl;
}
else{
cout<<"查找失败!"<<endl;
}
return p;
}


//插入 
status ListInsert(LinkList &L,int i,int e){
LNode *p=L;
LNode *s; 
int j=0;//因为插入的结点可能是首元节点 
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1){
L=(LNode *)realloc(L,sizeof(LNode));
}
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
cout<<"插入成功!"<<endl;
return OK;

}
//删除,将链表全部都删除,包括头结点 
status ListDelete(LinkList &L,int i){
//在带头结点的单链表L中,删除第i个元素 
LNode *p=L;
LNode *q;
int j=0;
while((p->next)&&(j<i-1)){
//查找第i-1个结点,p指向该点 
p=p->next;
++j;
}
if(!(p->next)||(j>i-1)){
//当i>n或i<1时,删除位置不合理 
return ERROR;
}
q=p->next;//临时保存被删结点的地址 
p->next=q->next;//改变被删结点前驱结点的指针域 
free(q);//释放删除结点的空间 
cout<<"删除成功!"<<endl; 
return OK;

//清除,除头结点外其余的都清除 ,每次清除首元结点 
void ClearList(LinkList &L){
LNode *p;
while(L->next){
p=L->next;
L->next=p->next;
free(p);
}

//前插法创建单链表
void createList(LinkList &L,int n){
int i; 
LNode *p;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;//建立一个带头指针的空链表
cout<<"请输入"<<n<<"个数:";
for(i=1;i<=n;i++){
p=(LNode *)malloc(sizeof(LNode));;
cin>>p->data;
p->next=L->next;
L->next=p;
}

//遍历链表中的元素并输出其值 
 void TraverseList(LinkList L){
cout<<"链表的元素有:";
LNode *p=L->next;
while(p){
   cout<<p->data<<" ";
p=p->next;
}
}
//后插法创建单链表
void createList_R(LinkList &L,int n){
int i;
LNode *p;
LNode *r=L;//尾指针 
cout<<"请输入"<<n<<"个数:"; 
for(i=1;i<=n;i++){
p=(LNode *)malloc(sizeof(LNode));
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}

//销毁
void DestroyList(LinkList &L){
if(L){
free(L);
cout<<"销毁成功!"<<endl;
}



//退出
void Quit(int &flag){
flag=0;
printf("按任意键退出!\n");
}  
 
 int main(){
  int flag=1,choice,number,e,i;
  int n;//前插法要插入几个元素 
LinkList L;
//
while(flag){
printf("对线性链表表有以下操作:\n");
printf("1.创建链表\n");
printf("2.插入元素\n");
   printf("3.查找某个元素\n");
printf("4.删除元素\n");
printf("5.后插法创建链表\n");
printf("6.遍历链表\n");
   printf("7.退出链表\n");
   printf("请输入选择1-7:");
scanf("%d",&choice); 
   switch(choice){
    case 1:InitList(L);
          break;
    case 2:printf("请输入插入元素的位置以及元素:");
          scanf("%d,%d",&i,&e);
      ListInsert(L,i,e);
      break;
case 3:printf("请输入查找的元素:\n");
      scanf("%d",&e);
  LocateElem(L,e);
  break;
case 4:printf("请输入要删除第几个元素:");
      scanf("%d",&e);
      ListDelete(L,e);
      break;
   case 5:printf("请输入要插入几个元素:");
      scanf("%d",&n);
      createList_R(L,n);
  break; 
case 6:TraverseList(L);
      break; 
case 7:Quit(flag);
      getch();
      break;
default:break;
   
}
   

DestroyList(L);
  return 0;
 }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值