单链表的特点:
如果一个结点只有一个指针域,称为单链表(Single Linked List)
#include <stdio.h>
#include <stdlib.h>
typedefchar DataType;
struct ListNode//定义键表中的结点
{
DataType data;//结点
structListNode *next;//指向后继结点的地址。结构体本身的指针。
};
typedefstruct ListNode *LinkList;//给结构的指针起别名。
void init(LinkList *s);
int ListLength(LinkList li);
LinkList GetNode(LinkList g,int i);
int main(int argc,const char * argv[])
{
LinkList pHead = NULL;//表示它是单链表的头指针。
//等效于。 struct LIstNode *pHead。
//LinkList pNode ;//定义一个指向结点的指针。
//等效于。struct ListNode *pnode;
init(&pHead);
int leng=ListLength(pHead);
printf("%d\n",leng);
return 0;
}
void init(LinkList *s)//初始化。
{
*s=NULL;
}
int ListLength(LinkList li)//求表长。
{
int nLength=0;
while(li!=NULL)
{
li=li->next;
nLength++;
}
return nLength;
}
LinkList GetNode(LinkList g,int i)//取i的结点。
{
int j=0;
for (; g&&j<i; j++)
{
g=g->next;
}
if (j<i)
{
return g;
}
returnNULL;
}
LinkList Locate(LinkList l,DataType x)//查找元素的位置;
{
while (l)
{
if (l->data==x)
{
return l;
}
l=l->next;
}
returnNULL;
}
void Insertlist(LinkList *p,DataType x,int i)//插入节点
{
//生成存储数据的新节点。
LinkList pNode=NULL;
pNode=(LinkList)malloc(sizeof(LinkList));
pNode->data=x;
pNode->next=NULL;
int ListLen=ListLength(*p)-1;
if (i<=0)//插入在第一个节点前面。
{
pNode->next=*p;
*p=pNode;
}
else if (i>ListLen)//插入在最后一个节点的后面。
{
GetNode(*p, ListLen)->next=pNode;
}
else//插入在节点的中间。
{
LinkList p1=GetNode(*p, i-1);
pNode->next=p1->next;
p1->next=pNode;
}
free(pNode);
}
void Delete(LinkList *p,int n)//删除节点。
{
LinkList p2=NULL;
if (n==0)
{
p2=*p;
*p=(*p)->next;
}
else
{
LinkList P1=GetNode(*p, n-1);
p2=P1->next;
P1->next=p2->next;
free(p2);
}
}