# include <stdio.h>
# include <malloc.h>
struct list
{
int num;
struct list * next;
};
typedef struct list node;
typedef node * link;
void printlist(link head); //输出 链表
link creatlist(int array[],int len); //创建链表
link insertlist(link ahead,link bhead); //合并链表
int lenghlist(link head); //测量长度
link sortlist(link head,int len); // 排序链表
link deletelist(link head,link ptr); //删除节点
link findlist(link head,int num); //遍历链表
link insertnode(link head,link ptr); //插入节点
void freelist(link head); //释放链表
int main (void)
{
int len,num;
link ahead,bhead,head,ptr;
int a[5]={1,2,3,4,5};
int b[5]={10,9,8,7,6};
printf ("输出链表a:\n");
ahead = creatlist(a,5); //创建链表 a
printlist(ahead); //输出链表a
printf ("输出链表b:\n");
bhead = creatlist(b,5); //创建链表b
printlist(bhead); //输出链表b
printf ("a表的长度为%d \n",lenghlist(ahead));
printf ("b表的长度为%d \n",lenghlist(bhead));
head = insertlist(ahead,bhead); //合并a,b链表
printlist(head);
printf ("排序:\n");
len = lenghlist(head);
head = sortlist(head,len); //对总链表进行排序
printlist(head);
printf ("请输入要删除的数字:\n");
scanf ("%d",&num);
ptr = findlist(head,num); //查找要删除节点的位置
head = deletelist(head,ptr); //删除节点
printlist(head);
printf ("请输入在哪个数字后插入n:\n");
scanf ("%d",&num);
ptr = findlist(head,num); //查找要插入节点的位置
head = insertnode(head,ptr); //插入节点
printlist(head);
freelist(head); //释放链表
return 0;
}
void printlist(link head)
{
link ptr;
ptr = head;
ptr = ptr->next;
while(ptr != NULL) //遍历
{
printf ("%d ",ptr->num);
ptr = ptr->next;
}
printf ("\n");
}
link creatlist(int array[],int len)
{
int i;
link head,ptr,ptr1;
head = (link)malloc(sizeof(node)); //创建头指针
if (!head)
return NULL;
ptr = head;
for (i=0;i<len;++i)
{
ptr1 = (link)malloc(sizeof(node));
if (!ptr1)
return NULL;
ptr1->num = array[i];
ptr1->next = NULL;
ptr->next = ptr1; //连接结点
ptr = ptr->next;
}
return head;
}
link insertlist(link ahead,link bhead)
{
link ptr1,ptr2,head;
ptr1 = ahead->next;
ptr2 = bhead->next;
head = ahead;
if (ptr1 == NULL && ptr2 == NULL)
return NULL;
else if (ptr1 == NULL)
return ptr2;
else if (ptr2 == NULL)
return ptr1;
while(ptr1->next != NULL)
ptr1 = ptr1->next;
ptr1->next = ptr2;
return head;
}
int lenghlist(link head)
{
int len=0;
link ptr;
ptr = head->next;
while(ptr != NULL) //遍历链表
{
ptr = ptr->next;
++len;
}
return len;
}
link sortlist(link head,int len)
{
int i,j,t;
link ptr1,ptr2;
ptr1 = head->next;
for (i=0;i<len-1;ptr1 = ptr1->next,++i) //任意排序即可
{
for (j=i+1,ptr2 = ptr1->next;j<len;ptr2 = ptr2->next,++j)
{
if (ptr1->num > ptr2->num)
{
t = ptr1->num;
ptr1->num = ptr2->num;
ptr2->num = t;
}
}
}
return head;
}
link deletelist(link head,link ptr)
{
link previous; //创建临时结点
if (!head)
return NULL;
previous = head->next;
while(previous != NULL)
{
if (previous->next == ptr)
previous->next = ptr->next; //删除结点
previous = previous->next;
}
return head;
}
link findlist(link head,int num)
{
link ptr;
ptr = head->next; //指针下移
while(ptr->num != num)
ptr = ptr->next;
return ptr;
}
link insertnode(link head,link ptr)
{
int num;
link ptr1;
link newnode;
newnode = (link)malloc(sizeof(node)); //为创建的新结点分配空间
if (!newnode)
return NULL;
scanf ("%d",&num);
newnode->num = num;
newnode->next = NULL; //为新节点的指针域赋零
ptr1 = head->next;
if(ptr1 == NULL)
{
newnode->next = head;
return newnode;
}
else
{
if (ptr1->next == NULL)
ptr1->next = newnode;
else
{
newnode->next = ptr->next; // 插入结点
ptr->next = newnode; //连接结点
}
}
return head;
}
void freelist(link head)
{
link ptr;
ptr = head;
head = head->next; // 指针移动
free(ptr); //释放结点
while(head != NULL)
{
ptr = head;
head = head->next;
free(ptr); //释放结点
}
}