#include<stdio.h>
#include<malloc.h>
#define OK 1 //执行成功
#define ERROR 0 //执行出错
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct LinkNode
{
ElemType data; //数据域
struct LinkNode *next; //指针域
} LinearNode;
typedef struct
{
LinkNode *head;
}LinearList; //记录头结点指针
void ElemInput(ElemType *e) //输入
{
scanf("%d",e);
};
void ElemOutput(ElemType e) //输出
{
printf("%d",e);
};
//1.初始化线性表,申请空间
Status InitList(LinearList *Lp)
{
Lp->head = (LinkNode *)malloc(sizeof(LinkNode));
if(Lp->head==NULL)
return ERROR;
Lp->head->next=NULL;
return OK;
}
//2.销毁线性表,释放空间
Status DestoryList(LinearList *Lp)
{
LinkNode *p = Lp->head, *pnext;
while(p!=NULL)
{
pnext = p->next;
free(p);
p = pnext;
}
Lp->head = NULL;
return OK;
}
//3.取线性表的长度
Status GetLength(LinearList L,int *lenp)
{
LinkNode *p=L.head;
int len=0;
if(p==NULL)
return ERROR; //未初始化
while(p)
{
p=p->next;
len++; //最后一个元素p=NULL时p也加1了,所以len比实际长度大1
}
*lenp = (len-1); //要加括号
return OK;
}
//4.判断线性表是否为空
Status IsEmpty(LinearList L,int *emptyp)
{
if(L.head==NULL)
return ERROR;
*emptyp = (L.head->next==NULL);
return OK;
}
//5.指定位置插入元素
Status Insert(LinearList *Lp,int i,ElemType e)
{
LinkNode *p = Lp->head,*newnode; //newnode记录新插入结点的地址
int j=0;
for(;j<i-1;j++) //找到插入位置的前一个结点
{
if(p==NULL) //i超过了表长 ,同时如果线性表未被初始化也会break
break;
p=p->next;
}
if(j<i-1 || i<1) //循环通过break退出 ,此条件可改为j!=i-1
return ERROR;
newnode = (LinkNode *)malloc(sizeof(LinkNode)); //建立新结点,从内存中新申请一个空间
newnode->data = e;
newnode->next=p->next;
p->next=newnode;
return OK;
}
//6.删除指定位置元素
Status Delete(LinearList *Lp,int i,ElemType *ep)
{
LinkNode *p = Lp->head,*deletenode; //deletenode记录删除结点的地址
int j=0;
for(;j<i-1;j++) //找到插入位置的前一个结点
{
if(p==NULL || p->next==NULL) //i超过了表长或第i个位置元素为空 ,同时如果线性表未被初始化也会break
break;
p=p->next;
}
if(j<i-1 || i<1) //循环通过break退出 ,此条件可改为j!=i-1
return ERROR;
deletenode=p->next;
p->next=deletenode->next;
free(deletenode);
return OK;
}
//7.取指定位置元素值
Status GetData(LinearList L,int i,ElemType *ep)
{
LinkNode *p = L.head;
int j=0;
if(i<0) //如果i为负数那么下面的循环会进入死循环
return ERROR;
for(j=0;j<i;j++)
{
if(p==NULL)
break;
p=p->next;
}
if(j!=i)
return ERROR;
*ep=p->data;
return OK;
}
//8.查询指定元素值在表中的位置
Status Locate(LinearList L,ElemType e,int *locp)
{
LinkNode *p;
int cnt=0;
if(L.head==NULL)
return ERROR;
p=L.head->next; //从第一个结点开始
while(p!=NULL)
{
cnt++;
if(p->data==e)
break;
p=p->next;
}
if(p == NULL)
*locp=0;
else
*locp=cnt;
return OK;
}
//9.依次输出线性表中所有数据元素
Status Print(LinearList L,char split) //split为元素间隔符
{
LinkNode *p;
if(L.head==NULL)
return ERROR;
p=L.head->next; //从第一个结点开始
while(p!=NULL)
{
ElemOutput(p->data);
printf("%c",split);
p=p->next;
}
printf("\n");
return OK;
}
int main()
{
int order,i,len,empty;
LinearList L;
L.head=NULL; //由于这个LinearList封装了一个指针所以必须进行初始化,这一点是和顺序存储结构不同的
ElemType e;
do
{
printf("====线性表的基本操作演示程序====\n");
printf("==1.初始化创建线性表============\n");
printf("==2.销毁线性表==================\n");
printf("==3.查询线性表的长度============\n");
printf("==4.判断线性表是否为空==========\n");
printf("==5.执行元素插入操作============\n");
printf("==6.执行元素删除操作============\n");
printf("==7.查询指定位置元素============\n");
printf("==8.查询指定元素位置============\n");
printf("==9.依次输出所有的数据元素======\n");
printf("================================\n");
printf("请输入操作指令序号:");
scanf("%d",&order);
switch(order)
{
case 1:
if(InitList(&L)==OK)
printf("操作成功,线性表已被初始化\n");
else
printf("线性表初始化失败,空间不足\n");
break;
case 2:
if(DestoryList(&L)==OK)
printf("操作成功,所占空间已被全部释放\n");
else
printf("操作失败,线性表未被初始化\n");
break;
case 3:
if(GetLength(L,&len)==OK)
printf("当前线性表长度为:%d\n",len);
else
printf("操作失败,线性表未被初始化\n");
break;
case 4:
if(IsEmpty(L,&empty)==ERROR)
printf("操作失败,线性表未被初始化\n");
else if(empty)
printf("当前线性表为空\n");
else
printf("当前线性表不为空\n");
break;
case 5:
printf("请依次输入插入位置及元素值(空格隔开):");
scanf("%d",&i);
ElemInput(&e);
if(Insert(&L,i,e)==OK)
printf("元素插入成功\n");
else
printf("元素插入失败\n");
Print(L,' ');
break;
case 6:
printf("请输入要删除的元素位置:");
scanf("%d",&i);
if(Delete(&L,i,&e)==OK)
printf("元素删除成功\n",e);
else
printf("元素删除失败\n");
Print(L,' ');
break;
case 7:
printf("请输入要查询的元素位置:");
scanf("%d",&i);
if(GetData(L,i,&e)==OK)
printf("查询成功,该元素为:%d\n",e);
else
printf("元素查询失败\n");
break;
case 8:
printf("请输入要查询的元素值:");
ElemInput(&e);
if(Locate(L,e,&i)==ERROR || i<1)
printf("元素查询失败\n");
else
printf("查询成功,该元素所在位置为:%d\n",i);
break;
case 9:
if(Print(L,' ')==ERROR)
printf("打印成功\n");
break;
}
printf("\n\n");
}while(order>0);
return 0;
}
DS||线性表链式存储结构
最新推荐文章于 2020-03-07 11:06:47 发布