具有头结点的链表,就是有一个虚构的结点,链表的中第一个结点其实是第二个结点。
#include<stdlib.h>
struct llist
{
int num;
struct llist *next;
};
typedef struct llist node;
typedef node *llink;
//输出结点值
void printllist(llink head)
{
llink ptr;
ptr=head->next;
while(ptr !=NULL)
{
printf("%d ",ptr->num);
ptr=ptr->next;
}
printf("\n");
}
//找结点
llink findnode(llink head,int value)
{
llink ptr;
ptr=head->next;
while(ptr !=NULL)
{
if(ptr->num==value)
{
return ptr;
}
ptr=ptr->next;
}
return NULL;
}
//创造链表
llink createllist(int *array,int len)
{
llink head;
llink ptr,ptr1;
int i;
head=(llink)malloc(sizeof(node));
if(head==NULL)
{
printf("内存分配失败!\n");
return NULL;
}
ptr=head;
for(i=0; i<len;i++)
{
ptr1=(llink)malloc(sizeof(node));
if(!ptr1)
{
return NULL;
}
ptr1->num=array[i];
ptr1->next=NULL;
ptr->next=ptr1;
ptr=ptr1;
}
return head;
}
//插入结点
llink insertnode(llink head,llink ptr, int nodevalue,int value)
{
llink new;
new=(llink)malloc(sizeof(node));
if(!new)
{
return NULL;
}
new->num=value;
new->next=NULL;
//找结点
llink getnode;
getnode=findnode(head,nodevalue);
//如果没找到结点,就是插在第一个结点之前
if(getnode ==NULL)
{
new->next=ptr->next;
ptr->next=new;
}
else//找到指定结点,就插在指定结点后面
{
new->next=getnode->next;
getnode->next=new;
}
return head;
}
int main(int argc,char *argv[])
{
int llist1[6]={1,2,3,4,5,6};
llink head;
head=createllist(llist1,6);
if(!head)
{
exit(1);
}
printf("原来的链表:");
printllist(head);
head=insertnode(head,head,6,23);
printf("插入后的链表:");
printllist(head);
}
struct llist
{
int num;
struct llist *next;
};
typedef struct llist node;
typedef node *llink;
//输出结点值
void printllist(llink head)
{
llink ptr;
ptr=head->next;
while(ptr !=NULL)
{
printf("%d ",ptr->num);
ptr=ptr->next;
}
printf("\n");
}
//找结点
llink findnode(llink head,int value)
{
llink ptr;
ptr=head->next;
while(ptr !=NULL)
{
if(ptr->num==value)
{
return ptr;
}
ptr=ptr->next;
}
return NULL;
}
//创造链表
llink createllist(int *array,int len)
{
llink head;
llink ptr,ptr1;
int i;
head=(llink)malloc(sizeof(node));
if(head==NULL)
{
printf("内存分配失败!\n");
return NULL;
}
ptr=head;
for(i=0; i<len;i++)
{
ptr1=(llink)malloc(sizeof(node));
if(!ptr1)
{
return NULL;
}
ptr1->num=array[i];
ptr1->next=NULL;
ptr->next=ptr1;
ptr=ptr1;
}
return head;
}
//插入结点
llink insertnode(llink head,llink ptr, int nodevalue,int value)
{
llink new;
new=(llink)malloc(sizeof(node));
if(!new)
{
return NULL;
}
new->num=value;
new->next=NULL;
//找结点
llink getnode;
getnode=findnode(head,nodevalue);
//如果没找到结点,就是插在第一个结点之前
if(getnode ==NULL)
{
new->next=ptr->next;
ptr->next=new;
}
else//找到指定结点,就插在指定结点后面
{
new->next=getnode->next;
getnode->next=new;
}
return head;
}
int main(int argc,char *argv[])
{
int llist1[6]={1,2,3,4,5,6};
llink head;
head=createllist(llist1,6);
if(!head)
{
exit(1);
}
printf("原来的链表:");
printllist(head);
head=insertnode(head,head,6,23);
printf("插入后的链表:");
printllist(head);
}