//数据结构中线性表的链式存储
//1.单链表
//定义,使用Node定义节点,使用Linklist定义指向节点的指针
typedef struct node
{
DataType data;
struct node * next;
}Node, *LinkList ;
//初始化:创建一个头结点并将其指针域设置为空,然后用一个linklist变量指向节点。
LinkList InitiateLinkList()
{
LinkList head;
head=malloc(sizeof(Node));
head->next=NULL;
return head;
}
//求表长
int LengthLinklist(LinkList head)
{
Node * p=head;
int cnt=0;
while(p->next!=NULL)
{
p=p->next;
cnt++;
}
return cnt;
}
//读表元素
Node * GetLinklist(LinkList head,int i)
{
Node *p;
p=head->next;
int c=1;
while ((c<i)&&(p!=NULL))
{
p=p->next;
c++;
}
if (i==c) return p;
else return NULL;
}
//定位
int LocateLinklist (LinkList head,DataType x)
{
Node *p=head;
p=p->next;
int i=0;
while (p!=NULL && p->data!=x)
{
i++;
p=p->next;
}
if (p!=NULL) return i+1;
else return 0;
}
/*插入:找到第i-1个节点q,然后生成一个值为x的新节点p,p的指针域指向q的后继节点,q的指针指向p*/
void InsertLinklist (LinkList head,DataType x,int i)
{
Node *p,*q;
if (i==1)
q=head;
else
q=GetLinklist(head,i-1);
if (q==NULL)
exit("can't found the location of insert!");
else
{
p=malloc(sizeof(Node));
p->data=x;
p->next=q->next;
q->next=p;
}
}
/*删除:p指向ai,q指向ai-1,q的next域指向ai+1,free(p) */
void DeleteLinklist(LinkList head,int i)
{
Node *q,*p;
if (i==1)
q=head;
else
q=GetLinklist(head,i-1);
if(q!==NULL&&q->next!=NULL)
{
p=q->next;
q->next=p->next;
free(p);
}
else exit("can't found delete of Node!")
}
//双循环
//定义
struct dbnode
{
DataType data;
struct dbnode *prior,*next;
}
typedef struct dbnode *dbpointer;
typedef dbpointer DLinkList;
//删除
void DeleteLinklist(DLinkList head,int i)
{
Node *p;
if (i==1)
p=head->next;
else
p=GetLinklist(head,i);
if(p!==NULL&&p->next!=NULL)
{
p->next->prior=p->prior;
p->prior->next=p->next;
free(p);
}
else exit("can't found delete of Node!")
}
//插入
void InsertLinklist (DLinkList head,DataType x,int i)
{
Node *p,*t;
if (i==1)
p=head;
else
p=GetLinklist(head,i-1);
if (p==NULL)
exit("can't found the location of insert!");
else
{
t=malloc(sizeof(Node));
t->data=x;
t->prior=p;
t->next=p->next;
p->next->prior=t;
p->next=t;
}
}