/*
*链表的建立、删除节点、侧长和打印;
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct LinkNode
{
int data;
struct LinkNode* next;
};
typedef LinkNode* LinkList;
//
LinkNode* AddNode(LinkNode* p,int data);
//
int list_length(LinkList head);
//
void list_print(LinkList head);
//
void list_delete_node(LinkList head,int num);
//
void list_reverse(LinkList head);
//
LinkNode* list_middle(LinkList head);
int main(void)
{
LinkList L1=(LinkNode*)malloc(sizeof(LinkNode));
LinkNode*pTemp=L1;
for(int i=0;i<10;i++)
{
pTemp=AddNode(pTemp,i);
}
int temp=list_length(L1);
printf("the length of L1 is %d\n",temp);
list_print(L1);
// list_delete_node(L1,8);
// list_reverse(L1);
// temp=list_length(L1);
// printf("the length of L1 is %d\n",temp);
// list_print(L1);
LinkNode*pr=list_middle(L1);
printf("the middle node of L1 is %d\n",pr->data);
system("pause");
return 0;
}
//
LinkNode* AddNode(LinkNode* p,int data)
{
LinkNode* pNode=(LinkNode*)malloc(sizeof(LinkNode));
pNode->data=data;
pNode->next=0;
p->next=pNode;
return pNode;
}
//
int list_length(LinkList head)
{
int length=0;
if(head==0) return length;
LinkList p=head->next;
while(p)
{
length++;
p=p->next;
}
return length;
}
//
void list_print(LinkList head)
{
if(head)
{
LinkList temp=head->next;
while(temp)
{
printf("%d\n",temp->data);
temp=temp->next;
}
}
}
void list_delete_node(LinkList head,int num)
{
if(head)
{
LinkNode* p,*q;
p=head;
q=head->next;
while(q)
{
if(q->data==num)
{
p->next=q->next;
free(q);
q=p->next;
}
else
{
p=q;
q=p->next;
}
}
}
}
//链表逆置
void list_reverse(LinkList head)
{
LinkList p1,p2,p3;
if(head)
{
if(head->next && head->next->next)
{
p2=head->next;
p3=p2->next;
while(p3)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next=p1;
p1=p2;
}
head->next=p1;
}
}
//遍历一次求获取位于中间位置的那个节点
LinkNode* list_middle(LinkList head)
{
if(head && head->next)
{
LinkList p,q;
p=q=head->next;
while(q)
{
p=p->next;
if(q->next)
{
q=q->next->next;
}
else break;
}
return p;
}
else
return 0;
}