线性表的链式存储实现c语言

线性表的链式存储

线性表的基本操作c语言实现

#include <stdio.h>

#include <malloc.h>
typedef int ElemType;
typedef struct SLink
{
ElemType data;
struct SLink *next; 
} SLink,*LinkList;          //若无*LinkList则需改变基本操作参数
bool InitList(LinkList &L)  //void InitList(SLink *&L)
{
L=(LinkList)malloc(sizeof(SLink));  //L=(SLink *)malloc(sizeof(SLink));
if(!L) return false;
L->next=NULL;
return true;
}
int GetLength(LinkList L)
{
 int i=0;
 LinkList p=L->next; //SLink *p=L->next;
 while(p!=NULL)
 {
p=p->next;
i++;
 }  
 return i;

/* int GetLength(SLink *L)*/ 
bool GetElem(LinkList L,int i,ElemType &elem)
{
LinkList p=L->next;  //SLink *p=L->next;
if (i<1 || i>GetLength(L)) return false;
for(int j=1;j<i;j++)
{
p=p->next;
}
/* while (j<i)      
    { 
p=p->next;
j++;
    } */
elem=p->data;
return true;
}
/* bool GetElem(SLink *L,int i,ElemType &elem)*/  
int Locate(LinkList L,ElemType elem)//按值查找
{
int i=1;
LinkList p=L->next;    // SLink *p=L->next;
    while(p!=NULL&&p->data!=elem)       //从第1个结点开始查找data域为elem的结点
{
p=p->next;
i++;
}
if (p==NULL)
return 0;
else
return i;
}  
/* int Locate(SLink *L,ElemType elem)  */ 
bool InsertElem(LinkList L,int i,ElemType elem)//插入结点
{
int j=1;
LinkList p=L,s;
s=(LinkList)malloc(sizeof(SLink));       // s=(SLink *)malloc(sizeof(SLink));
if(!s) return false;        //i参数不正确,插入失败
s->data=elem;s->next=NULL;     //创建data域为elem的结点
if (i<1 || i>GetLength(L)+1) return false;
while(j<i)         //从头结点开始找,查找第i-1个结点,由p指向它
{
p=p->next;
j++;
}                         //跳出循环时为第i-1个结点
s->next=p->next;       //将*s的next域指向*p的下一个结点(即第i个结点)
p->next=s;              //将*p的next域指向*s,这样*s变成第i个结点
return true;       //插入运算成功
}
/* bool InsertElem(SLink *L,int i,ElemType elem)*/   
bool DeleteElem(LinkList L,int i)
{
int j=1;
LinkList p=L,q;
if (i<1 || i>GetLength(L)) return false;//i参数不正确,插入失败
    while(j<i)  //从头结点开始,查找第i-1个结点,由p指向它
{
p=p->next;
j++;

    q=p->next;       //由q指向第i个结点
    p->next=q->next;  //p-next=p-next->next;
    free(q);           //释放第i个结点占用的空间
    return true; //删除运算成功
}
/* bool DeleteElem(SLink *L,int i) */
void SLinkTraverse(LinkList L)    //输出单链表
{
LinkList p=L->next;
while (p!=NULL) 
{
printf("%3d",p->data);
p=p->next;
    }
printf("\n");
}
/*  void SLinkTraverse(SLink *L)*/
int main()
{

LinkList L;            //SLink *L;
InitList(L);
InsertElem(L,1,1);InsertElem(L,5,5);
InsertElem(L,2,2);
InsertElem(L,3,3);
InsertElem(L,4,4);
printf("线性表:");SLinkTraverse(L);
    int i=3,elem;GetElem(L,i,elem);
  printf("第%d个元素:%d\n",i,elem);
    printf("元素%d是第%d个元素\n",elem,Locate(L,elem));
i=4;printf("删除第%d个元素\n",i);
DeleteElem(L,i);
printf("线性表:");SLinkTraverse(L);
printf("hello");
return 0;
}

猜你喜欢

转载自blog.csdn.net/lin1094201572/article/details/78709539