数据结构中线性表的c语言代码实现

/*
 LinkList *L定义了一个LinkList指针
  LinkList *&L是指针的引用
*/ 
#include
#include
typedef char ListData;   //定义线性表    char  int等类型 
typedef struct  List
{
    ListData data;
    struct List *next;    
}LinkList;


void CreateListB(LinkList *&L,ListData a[],int n)
{
   LinkList *s;
   int i;
   L=(LinkList *)malloc(sizeof(LinkList));
   L->next=NULL;
   for(i=0;i<=n;i++)
   {
       s=(LinkList *)malloc(sizeof(LinkList));      //头插法建表 
       s->data=a[i];
       s->next=L->next;
       L->next=s;               
   }     

void CreateListA(LinkList *&L,ListData a[],int n)   //首地址   线性表内容为a[] 数组内容  n  为线性表 长度 
{
    LinkList *s,*r;
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));     //为结点 L 动态分配内存 
    r=L;
    for(i=0;i     {
       s=(LinkList *)malloc(sizeof(LinkList));
       s->data=a[i];
       r->next=s;
       r=s;
    }
    r->next=NULL;
}//尾插法建表 
void InitList(LinkList *&L)    //初始化线性表 
{
   L=(LinkList *)malloc(sizeof(LinkList));
   L->next=NULL;  
}
void DestroyList(LinkList *&L)   //销毁线性表 
{
   LinkList *p=L,*q=p->next;
   while(q!=NULL)
   {
     free(p);    //释放 p 指针指向的内存 
     p=q;
     q=p->next;              
   }     
   free(p);
}
int ListEmpty(LinkList *L)   //判断线性表是否为空 
{
   return (L->next==NULL);    

int ListLength(LinkList *L)    //求线性表的长度  返回 
{
   LinkList *p=L;
   int n=0;
   while(p->next!=NULL)
   {
      n++;p=p->next;                    
   }
   return (n);    

void DispList(LinkList *L)          //输出线性表内容 
{
   LinkList *p=L->next;
   while(p!=NULL)
   {
      printf("%c",p->data);
      p=p->next;                    
   } 
   printf("\n");     

int getElem(LinkList *L,int i,ListData &e)  // 线性表  第几个    线性表数据地址 
{                                           //求线性表某个数据的元素值 
   int j=0;
   LinkList *p=L;
   while(j    {
      j++;p=p->next;                
   }  
   if(p==NULL)
   return 0;
   else
   {
    e=p->data;   return 1;
   }  
}                                             
int LocateElem(LinkList *L,ListData e)  //按元素查找 
{
     LinkList *p=L->next;
 int i=1;
 while(p!=NULL&&p->data!=e)             
 {
  p=p->next;i++;                     
 }
 if(p==NULL)return(0);
 else return(i);   

int ListInsert(LinkList *&L,int i,ListData e)   //插入数据元素    位置  ,元素 
{
   int j=0;
   LinkList *p=L,*s;
   while(j    {
      j++;p=p->next;                     
   } 
   if(p==NULL)
   return 0;
   else
    {
      s=(LinkList*)malloc(sizeof(LinkList)); 
      s->data=e;s->next=p->next;p->next=s;
      return 1;       
    }  

int ListDelete(LinkList *&L,int i,ListData &e)    //删除数据元素 
{
    int j=0;
    LinkList *p=L,*q;
    while(j     {
      j++;  p=p->next;                   
    } 
    if(p==NULL)
    return 0;
    else
    {
          q=p->next;
  if(q==NULL)return 0;
  e=q->data;
  p->next=q->next;
  free(q);
  return 1;   
    }

int main()
{
   ListData e ,a[5]={'a','b','c','d','e'};
   LinkList *L;
   InitList (L);         //初始化线性表 
   CreateListA(L,&a[0],5);   //把元素按顺序尾插法插入线性表中 
   printf("单链表为   ");
   DispList(L);            //输出元素 
  
   printf("该线性表的长度为   ");   
   printf("%d\n",ListLength(L));     //为何会出现 6   
   
   if(ListEmpty(L)) printf("该单链表为空。\n");   //判断是否为空 
   else printf("该单链表不为空。\n");
   
   printf("该链表第4个元素为  ");
   getElem(L,4,e);       //把输出的对应的元素赋值给   e   
   printf("%c\n",e);
  
   printf("该链表 b 为第 "); 
   printf("%d 个元素\n",LocateElem(L,'b'));  //调用函数 输出b 的位置 
  
   printf("在第3个位置加上'f'后链表为:");  
   ListInsert(L,3,'f');                    //插入元素 
   DispList(L); 
   
   printf("删除第4个元素");               //删除元素 
   ListDelete(L,4,e);
   DispList(L);  
   DestroyList(L);                          //释放顺序表 
   while(1);  
   return 0;      







































 

你可能感兴趣的:(数据结构)