数据结构(严蔚敏版)配套实验报告册--单链表的基本操作
copy之前请先点赞!! 码字不易!!
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//#define NULL 0
typedef int Status;
typedef int ElemType;
typedef struct LNode1
{
ElemType data;
struct LNode1 * next;
}LNode,* LinkList;
void CreateList_L(LinkList &L,int n)
{//逆序输入n个元素的值,建立带表头结点的单链表L
int i;
LNode *p;
L=(LinkList)malloc(sizeof(LNode));
L->data=0;//存放表长
L->next=NULL;
printf("Please Input data\n");
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
L->data++;
}
}
Status GetElem_L(LinkList L,int i,ElemType &e)
{//在带头结点的单链表中查找第i个结点
LNode *p;
int j;
p=L->next;
j=1;
while(p&&j<i)
{ p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{//带头结点的单链表的插入
int j;
LNode *p,*s;
p=L;j=0;
while(p&&j<i-1)
{p=p->next;++j;}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
L->data++;
return OK;
}
Status ListDetele_L(LinkList &L,int i,ElemType &e)
{//带头结点的单链表的删除
int j;
LNode *p,*q;
p=L;
j=0;
while(p->next&&j<i-1)
{p=p->next;++j;}
if((!p->next)||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
L->data--;
return OK;
}
Status Traverse_L(LinkList L)
{//遍历链表
LNode *p=L->next;
printf("this list contains %d elements\n",L->data);
while(p)
{
printf("%5d->",p->data);
p=p->next;
}
printf("NULL\n");
return OK;
}
int Length_L(LinkList L)
{//求链表的长度
int len=0;
LinkList p;
p=L;
while(p->next!=NULL)
{len++;p=p->next;}
return len;
}
Status Delete_Between(LinkList &L,ElemType mink,ElemType maxk)
{//删除元素递增排列的链表L中的值大于mink且小于maxk大的所有元素
LinkList p,q,prev=NULL;
if(mink>maxk)return ERROR;
p=L;
prev=p;
p=p->next;
while(p&&p->data<maxk)
{if(p->data<=mink)
{prev=p; p=p->next; }
else
{prev->next=p->next; q=p; p=p->next; free(q);L->data-- ;}
}
return OK;
}
Status ListOppose_L(LinkList &L) {
LinkList p,q;
p=L;
p=p->next;
L->next=NULL;
while(p){
q=p; p=p->next; q->next=L->next; L->next=q; }
return OK;
}
int main()
{
LinkList L;int n,i,i1,i2,e,e1,e2,j1,j2;
printf("Please input the number in the list:");
scanf("%d",&n);
CreateList_L(L,n);
Traverse_L(L);
printf("the length is :%d\n",Length_L(L));
printf("Get elem i:");
scanf("%d",&i);
GetElem_L(L,i,e);
printf("the NO.%d elem is:%d\n",i,e);
printf("Insert position:");
scanf("%d",&i1);
printf("Insert number:");
scanf("%d",&e1);
ListInsert_L(L,i1,e1);
Traverse_L(L);
printf("Delete position:");
scanf("%d",&i2);
ListDetele_L(L,i2,e2);
Traverse_L(L);
printf("\nDelete between(a,b):");
scanf("%d,%d",&j1,&j2);
printf("the result is:%d\n",Delete_Between(L,j1,j2));
Traverse_L(L);
printf("the length is :%d\n",Length_L(L));
printf("the result is:%d\n",ListOppose_L(L));
Traverse_L(L);
}