数据结构作业:设某线性表数据元素类型为整型,以链表结构存储线性表。试编程实现:
⑴ 输入数据元素,以先进先出形式创建单链表
⑵ 销毁单链表
⑶ 线性表置空
⑷ 求线性表长度
⑸ 在第i个数据元素前插入新的元素
⑹ 删除第i个元素
⑺ 显示线性表中的全部元素
⑻ 求最大元素的值和平均值
#include<stdio.h>
#include<malloc.h>
/* 定义ElemType为int类型 */
typedef int ElemType;
#define OK 1
#define ERROR 0
#define flag -0
/* 单链表的结点类型 */
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
/* 初始化单链表 */
LinkList InitLinkList()
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
/* 清空单链表 */
void ClearLinkList(LinkList L)
{
L->next=NULL;
printf("链表已经清空/n");
}
void DestoryList(LNode *head)
{
LNode *p,*q;
p=head;
q=head->next;
while(p)
{
free(p);
p=q;
/* 使用指针前判断其非空 */
if (q)
q=q->next;
}
printf("链表销毁成功!/n");
}
/* 检查单链表是否为空 */
int LinkListEmpty(LinkList L)
{
if(L->next==NULL) return OK;
else return ERROR;
}
/* 遍历单链表 */
void LinkListTraverse(LinkList L)
{
LinkList p;
p=L->next;
if(p==NULL) printf("单链表为空表/n");
else
{
printf("链表中的元素为:/n");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
printf("/n");
}
/* 求单链表长度 */
int LinkListLength(LinkList L)
{
LinkList p;
int j;
p=L->next;
j=0;
while(p!=NULL)
{
j++;
p=p->next;
}
return j;
}
/* 从链表中查找元素 */
LinkList GetLinkList(LinkList L,int i)
{
LinkList p;
int j;
p=L->next;
j=1;
while(p!=NULL&&j<i)
{
p=p->next; j++;
}
if (j==i)
return p;
else return NULL;
}
/* 从链表中查找与给定元素值相同的元素在顺序表中的位置 */
int LocateLinkList(LinkList L,ElemType x)
{
LinkList p;
int j;
p=L->next; j=1;
while ( p!=NULL && p->data != x)
{
p=p->next;
j++;
}
if(p)
return j;
else
return 0;
}
/* 向链表中插入元素 */
void LinkListInsert(LinkList L, int i, ElemType e)
{
LinkList p,s;
int j;
j=1;
p=L;
while(p&&j<i)
{
p=p->next;
j++;
}
if(p==NULL||j>i)
printf("插入位置不正确/n");
else {s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
printf("%d已插入到链表中/n",e);
}
}
/* 从链表中删除元素 */
void LinkListDelete(LinkList L,int i)
{
LinkList p,q;
int j;
j=1;
p=L;
while(p->next&&j<i)
{
p=p->next;
j++;
}
if(p->next==NULL)
printf("删除位置不正确/n");
else
{
q=p->next;
p->next=q->next;
free(q);
printf("第%d个元素已从链表中删除/n",i);
}
}
/*建立单链表*/
LinkList CreatLinkList( )
{
LinkList L=InitLinkList(),p,r;
ElemType e;
r=L;
printf("请依次输入链表中的元素,输入-0结束/n");
scanf("%d",&e);
while (e!=flag)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
r->next=p;
r=p;
scanf("%d",&e);
}
r->next=NULL;
return L;
}
void LinkListM(LinkList L)
{
double aver=0;
int MAX=0;
LinkList p;
p=L->next;
if(p==NULL) printf("单链表为空表/n");
else
{
while(p!=NULL)
{
aver+=p->data;
if(MAX<p->data)
MAX=p->data;
p=p->next;
}
printf("链表中最大元素是: %d/n",MAX);
aver=aver/LinkListLength(L);
printf("链表中元素平均值是: %f/n",aver);
}
printf("/n");
}
int scan()
{
int d;
printf("/t*********操作菜单***********/n");
printf("1.初始化 2.清空 3.求链表长度 4.检查链表是否为空/n");
printf("5.输出链表中元素 6.从链表中查找元素/n");
printf("7.从链表中查找与给定元素值相同的元素在顺序表中的位置/n");
printf("8.向链表中插入元素 9. 从链表中删除元素/n");
printf("10.建立带头结点的单链表/n");
printf("11.求链表中最大元素和平均值/n");
printf("12.销毁链表/n");
printf("其他键退出。。。。。/n");
scanf("%d",&d);
return(d);
}
void main()
{
int quit=0;
int i,locate;
ElemType e;
LinkList L,p;
while(!quit)
switch(scan())
{
case 1:
L=InitLinkList();
printf("/n");
break;
case 2:
ClearLinkList(L);
printf("/n");
break;
case 3:
printf("链表的长度为 %d/n/n",LinkListLength(L));
break;
case 4:
if(LinkListEmpty(L))printf("链表为空/n/n");
else
printf("链表非空/n/n");
break;
case 5:
LinkListTraverse(L);
break;
case 6:
printf("请输入待查询元素在链表中的位置:");
scanf("%d",&i);
p=GetLinkList(L,i);
if(p)
printf("链表中第%d个元素的值为:%d/n/n",i,p->data);
else
printf("查询位置不正确/n/n");
break;
case 7:
printf("请输入待查询元素的值:");
scanf("%d",&e);
locate=LocateLinkList(L,e);
if(locate)
printf("%d在链表中的位置是:%d/n/n",e,locate);
else
printf("链表中没有值为%d的元素/n/n",e);
break;
case 8:
printf("请输入插入元素的位置和值(中间以空格或回车分隔):/n");
scanf("%d%d",&i,&e);
LinkListInsert(L,i,e);
break;
case 9:
if(LinkListLength(L)==0)
printf("链表已经为空,不能删除/n/n");
else
{
printf("请输入待删除元素的位置:/n/n");
scanf("%d",&i);
LinkListDelete(L,i);
}
break;
case 10:
L=CreatLinkList();
printf("/n");
break;
case 11:
LinkListM(L);
break;
case 12:
DestoryList(L);
break;
default:
quit=1;
}
}