#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;
}
#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;
}