线性表的链式存储
线性表的基本操作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;
}