线性链表的实现(c语言)

 

 线性链表的多种操作算法(C语言)

2009年05月30日 星期六 21:51

数据结构作业:设某线性表数据元素类型为整型,以链表结构存储线性表。试编程实现:
⑴ 输入数据元素,以先进先出形式创建单链表
⑵ 销毁单链表
⑶ 线性表置空
⑷ 求线性表长度
⑸ 在第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;
}
}


你可能感兴趣的:(数据结构,c,struct,null,语言,作业)