#ifndef MY_LIST_HHHHHHHHH
#define MY_LIST_HHHHHHHHH
/*********************************************************************
author:yiwu
date :2013-03-26
mark :简单线性表操作
**********************************************************************/
struct Node
{
int data;
Node* next;
Node(){memset(this,0,sizeof(Node));}
};
Node* CreatList() //创建链表,第一个头结点没法释放内存
{
Node* head,*p,*p1;
head = (Node*)malloc(sizeof(Node));
if(NULL == head)
{
return NULL;
}
p = head;
int data;
printf("please input data:\n");
bool bContinue = true;
while(bContinue)
{
scanf("%d",&data);
if(data > 0)
{
p1 = (Node*)malloc(sizeof(Node));
if(NULL == p1)
{
break;
}
p1->data = data;
p->next = p1;
p = p1;
bContinue = true;
}
else
{
bContinue = false;
}
}
head = head->next;
p->next = NULL;
return head;
}
void ReleaseList(Node* pHead)//释放链表
{
if(NULL == pHead)
return ;
Node* temp = pHead;
while(temp)
{
free(temp);
temp = temp->next;
}
}
void print(Node* pNode) //输出链表信息
{
if(NULL == pNode)
return ;
while( NULL != pNode )
{
printf("%d->",pNode->data);
pNode = pNode->next;
}
printf("\b\b");
}
Node *reverse(Node *head)//链表逆序
{
Node *p1,*p2,*p3;
if (head == NULL || head->next == NULL)
return head;
p1 = head, p2 = p1->next;
while (p2)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
head->next = NULL;
head = p1;
return head;
}
Node *InsertFirst(Node* pHead,int elementData)//在表头插入
{
if( NULL == pHead || elementData <= 0)
return NULL;
Node *pNode = (Node*)malloc(sizeof(Node));
if(NULL == pNode)
{
return NULL;
}
pNode->data = elementData;
pNode->next = pHead;
pHead = pNode;
return pHead;
}
Node *InsertEnd(Node* pHead,int elementData)//在表尾插入
{
if(NULL == pHead || elementData <= 0)
return NULL;
Node *pNode = (Node*)malloc(sizeof(Node));
if(NULL == pNode)
{
return NULL;
}
Node *temp = pHead;
while(temp->next != NULL)
{
temp = temp->next; //最后一个节点
}
pNode->data = elementData;
pNode->next = NULL;
temp->next = pNode;
return pHead;
}
Node *Insert(Node* pHead,int elementData,int key)//找到第一个大于key值的节点后在其后面插入
{
Node* temp = pHead;
Node* p1 = temp->next;
Node* pInsert = (Node*)malloc(sizeof(Node));
pInsert->data = elementData;
pInsert->next = NULL;
while(p1)
{
if(temp->data >= key)
{
temp->next = pInsert;
pInsert->next = p1;
break;
}
else
{
temp = temp->next;
p1 = p1->next;
}
}
return pHead;
}
bool IsEmpty(Node* pHead)//判断链表是否为空
{
if(pHead->next == NULL)
return true;
else
return false;
}
int GetListLength(Node *pHead)//获取链表长度包含头结点
{
if(NULL == pHead)
return 0;
int length = 0;
Node *temp = pHead;
while(temp != NULL)
{
length++;
temp = temp->next;
}
return length;
}
Node* MergeList(Node *pHead1,Node *pHead2,Node *&pHead)//将两个升序表仍按序合并到pHead
{
Node *p1 = pHead1;
Node *p2 = pHead2;
pHead = (Node*)malloc(sizeof(Node));
pHead->data = 0;
Node *p3 = pHead;
while(p1 && p2)
{
if(p1->data <= p2->data)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1 ? p1:p2;
return pHead;
}
Node* DeleteNode(Node* pHead,int key)//删除数据为key值的节点,如果没有key值对应的节点则直接返回
{
if(NULL == pHead || key <= 0)
return NULL;
Node* temp = pHead;
Node* p = pHead->next;
while(p)
{
if(p->data == key)
{
temp->next = p->next;
free(p);
break;
}
else
{
temp = temp->next;
p = p->next;
}
}
return pHead;
}
Node* SortList(Node* pHead) //将链表按升序排列
{
return NULL;
}
#endif