typedef struct node{ //链表的线性表示的定义
int data;
struct node *next;
}listnode,*linklist;
linklist CreateLinklist_l(){ //创建链表
linklist head;
head = (linklist)malloc(sizeof(listnode));
head->next = NULL;
return head;
}
void VisitLink(linklist head){ //遍历
linklist p = head->next;
while(p){
printf("%d",p->data);
p = p->next;
}
printf("/n");
}
int SearchLinklist(linklist head,int value){ //查找
linklist p=head->next;
int pos = 1;
while(p){
if(p->data == value){
return pos;
}
p=p->next;
pos++;
}
return 0;
}
int GetLinklist(linklist head,int pos,int *val){ //获得特定位置的值
linklist p=head;
if(pos<1){
printf(ERROR1);
return -1;
}
while(pos--){
p=p->next;
if(NULL ==p){
printf(ERROR2);
return -1;
}
}
*val=p->data;
return 0;
}
void InsertLinklist_2(linklist head,int value){ //插入
linklist p=head,q;
while((p->next!=NULL)&&(p->next->data<value)){
p=p->next;
}
q=(linklist)malloc(sizeof(listnode));
q->data=value;
q->next=p->next;
p->next=q;
return;
}
int DeleteLinklist_1(linklist head,int pos){ //删除
linklist p=head,q;
if(pos<1){
printf(ERROR1);
return -1;
}
while(--pos){
p=p->next;
if(NULL==p){
printf(ERROR2);
return -1;
}
}
if(NULL==(q=p->next)){
printf(ERROR2);
return -1;
}
p->next=q->next;
free(q);
return 0;
}
void DeleteLinklist_2(linklist head,int value){
linklist p,q;
p=head;
q=p->next;
while(q){
if(q->data==value){
p->next=q->next;
free(q);
}
else{
p=q;
}
q=p->next;
}
return;
}
void ListConcat(LinkList ha,LinkList hb,LinkList &hc){ //把链表hb接在ha后面形成的链表hc
hc=ha;
p=ha;
while(p->next)p=p->next;
p->next=hb;
}//ListCOncat
void LinkList_reverse(Linklist *L){ //单链表的逆转操作 链表的就地逆置;为简化算法,假设表长大于2
Linklist *p,*q;
p=L->next;
q=p->next;
s=p->next;
p->next=NULL;
while(s->next){
q->next=p;
p=q;
q=s;
s=s->next; //把L的元素逐个插入新表表头
}
q->next=p;
s->next=q;
L->next=s;
}//LinkList_reverse