#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef struct LNode{ //链表结构
int data;
struct LNode *next;
}LNode, *LinkList;
void CreatedList_L(LinkList &L,int n){
//逆位序输入n个元素的值,建立带头结点的单链线性表L
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//建立一个带头结点的单链表
LinkList Y=L;
printf("输入%d个元素\n",n);
for(int i=n;i>0;--i){
LinkList p=(LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&(p->data)); //输入元素值
p->next=NULL; //插入表头
Y->next=p;
Y=p;
}
printf("ok\n");
}
int GetElem_L(LinkList L,int i,int &e){
//L为带头结点单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LNode *p=L->next; //p指向第一个结点
int j=1; //计数器
while(p&&j<i){
p=p->next; ++j;
}
if(!p||j>i) return ERROR;
e=p->data;
return e;
}
int ListInsert_L(LinkList &L,int i,int e){
//在带头结点的单链表L的第i个位置前插入元素e
LNode *p=L; int j=0;
while(p&&j<i-1){ //寻找第i-1个结点
p=p->next;
++j;
}
if(!p||j>i-1) return ERROR; //i小于1或者大于表长加一
LNode *s=(LinkList)malloc(sizeof(LNode)); //生成新结点
s->data=e; s->next=p->next; //插入L
p->next=s;
return OK;
}
int ListDelete_L(LinkList &L,int i,int &e){
//在带头结点的单链表L中,删除第i个元素,并用e返回
LinkList p=L; int j=0;
while(p->next&&j<i-1){ //寻找第i个结点,令p指向其前驱
p=p->next; ++j;
}
if(!(p->next)||j>i-1) return ERROR;//删除位置不合理
LinkList q=p->next; p->next=q->next; //删除并释放结点
e=q->data; free(q);//
return OK;
}
void L_cout(LinkList &L){
LinkList q=L;
while(q->next){//输出线性表元素
printf("%d ",q->next->data);
q=q->next;
}
printf("\n");
}
int main(){
int A;//用作判断循环
LinkList L;
int n;
printf("请输入线性表元素的个数\n");
scanf("%d",&n);//输入元素
CreatedList_L(L,n);//
L_cout(L);
printf("请输入将要对线性表进行的操作\n");
int k;
do{
printf("1: 插入元素;2:删除元素;3:查找元素。\n");
scanf("%d",&k);
switch(k){
case 1://插入元素
{int i,e;//定义变量
printf("输入要插入元素的位置和元素的值\n");
scanf("%d%d",&i,&e);//输入值
i=ListInsert_L(L,i,e);
if(i) printf("插入成功\n");//判断
else printf("输出失败\n");
L_cout(L);
break;
}
case 2://删除元素
{
int i,e;//定义变量
printf("请输入要删除的元素的位置\n");
scanf("%d",&i);//输入值
i=ListDelete_L(L,i,e);
L_cout(L);
if(i) printf("删除成功,删除元素为%d\n",e);//判断
else printf("删除失败\n");
break;
}
case 3:
int i,e;//定义变量
printf("请输入要查找的位置\n");
scanf("%d",&i);
e=GetElem_L(L,i,e);
if(e) printf("第%d个位置的元素为:%d\n",i,e);
else printf("无此元素\n");
break;
}//switch
printf("结束操作请输入 0 ;否则输入任意值继续\n");
scanf("%d",&A);
}while(A!=0);
}
数据结构(C语言):链表的基本操作
最新推荐文章于 2021-05-21 02:57:37 发布