天天看点

数据结构之线性表的双链表实现(3)

#include<stdio.h>

#include<malloc.h>

//双链表

typedef struct LNode { //定义结点

int elem;//数据域

struct LNode * prior,* next;

}LNode,*LinkList;

LinkList HeadInsert(LinkList &L){

LNode *node;

int x;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

L->prior=NULL;

scanf("%d",&x);

while(x!=-1000){

node=(LNode *)malloc(sizeof(LNode));

node->elem=x;

node->prior=L;

node->next=L->next;

L->next->prior=node;

L->next=node;

scanf("%d",&x);

}

return L;

}

LinkList TailInsert(LinkList &L){

int x;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

L->prior=NULL;

LNode *node;

LNode *r=L;//放在初始化L语句之后,

scanf("%d",&x);

while(x!=-1000){

node=(LNode )malloc(sizeof(LNode));

node->elem=x;

r->next=node;

node->prior=r;

r=node;

scanf("%d",&x);

}

r->next=NULL;

return L;

}

LNode GetElemByrank(LinkList L,int i){ //按序号查找结点

int j=1;

LNode *p=L->next;

if(i==0)

return L;

if(i<1)

return NULL;

while(p&&j!=i){

p=p->next;

j++;

}

return p;

}

LNode* GetElemBynumber(LinkList L,int i){ //按值查找结点

LNode *p=L->next;

while(p!=NULL){
	if(p->elem!=i)
	p=p->next;
	else return p;
}
return p;
           

}

int insertNode(LinkList &L,int i,int e){//插入

LNode *p; //插入结点

LNode *q=GetElemByrank(L,i-1);//定位结点

int j=1;

p=(LNode *)malloc(sizeof(LNode));

p->next=NULL;

p->elem=e;

if(!p) return 0;

p->next=q->next;

q->next->prior=p;

p->prior=q;

q->next=p;

return 1;

}

int deleteNode(LinkList &L,int i){ //删除操作

LNode *temp;

if(i<1) return 0;

LNode *q=GetElemByrank(L,i-1);//定位结点

temp=q->next;

temp->next->prior=q;

q->next=temp->next;

free(temp);

return 1;

}

int LinkLength(LinkList L){

int j=0;

LNode *q;

if(!L->next) return j;

q=L->next;

j++;

while(q!=NULL)

j++;

return j;

}

int printLink(LinkList L){

LNode *q;

int e;

if(L->next==NULL){

printf(“链表为空”);

return 0;

}

q=L->next;

while(q!=NULL){

e=q->elem;

printf("%d “,e);

q=q->next;

}

printf(”\n");

return 1;

}

int main(){

LinkList L;

LNode * node;

L=TailInsert(L);

printLink(L);

printf(“按照数值得到:\n”);

node=GetElemBynumber(L,3);//按照数值得到

printf("%d\n",node->elem);

printf(“按照序得到:\n”);

node=GetElemBynumber(L,3);//按照序得到

printf("%d\n",node->elem);

printf(“删除得到:\n”);

deleteNode(L,3);//删除

printLink(L);

printf(“插入得到:\n”);

insertNode(L,3,250);//插入

printLink(L);

return 1;

}

继续阅读