下面是我建的单链表
没有封装 用时小小点
#include"stdio.h"
#include"malloc.h"
/******************************************/
/******************************************/
typedef int ListItem;
typedef struct node*link;
typedef struct node
{
ListItem element;
link next;
} Node;
/****************************************************/
/*****************************************************/
typedef struct llist* List;
typedef struct llist
{
link first;
}Llist;
link NewNode()
{
link p;
if((p=(link)malloc(sizeof(*p)))==NULL )
{
printf("Exhausted memomery");
return NULL;
}
else
return p;
}
List ListInit()
{
List L=(List)malloc(sizeof(*L));
L->first=NULL;
return L;
}
int ListLength(List L)
{
int length=0;
link p;
p=L->first;
while(p)
{
++length;
p=p->next;
}
return length;
}
ListItem ListRetrrieve(int k ,List L) //返回第k处的元素
{
if(k<1)
{
printf("Out of Renges");
// return ;
}
link p;int i=1;
p=L->first;
while (i<k && p)
{
++i;
p=p->next;
}
return p->element;
}
int ListLocate(int x,List L)
{
link p; int locate=1;
p=L->first;
while(p)
{
if(p->element==x)
break;
else
{
p=p->next;
++locate;
}
}
return locate;
}
int ListInsert(int k,int x,List L)
{
link p,y;
if(k>=0)
{
int i;
p=L->first;
for (i=1;i<k && p;++i)
{
p=p->next; //p的位置就是k的位置
}
y=NewNode();
y->element=x;
if(k>0)
{
y->next=p->next;
p->next=y;
return 1;
}
else
{
y->next=L->first;
L->first=y;
return 1;
}
}
}
ListItem ListDeleteItem(int k,List L)
{
link p=L->first; // p是首元素的地址
ListItem x;
link q;
if(k<1 || !p)
{
printf("the k isnot exist");
return NULL;
}
if(k==1)
L->first=p->next;
else
{
q=L->first;
for (int i=1;i<k-1;++i)
{
q=q->next; //第k-1元素的节点
if(!q)
{
printf("the k isnot exist!");
break;
}
}
p=q->next; //第k个元素的节点
q->next=p->next;
x=p->element;
free(p);
}
return x;
}
void ListPrint(List L)
{
link p;
p=L->first;
while(p)
{
printf("%5d ",p->element);
p=p->next;
}
}
int main ()
{
List MyList;
MyList=ListInit();
for (int i=0;i<10;++i)
{
ListInsert(i,i*i,MyList);
}
ListPrint(MyList);
ListDeleteItem(3,MyList);
printf("\n");
ListPrint(MyList);
return 1;
}
运行结果