List的简单操作,未完待续

来源:互联网 发布:乐高编程机器人价格 编辑:程序博客网 时间:2024/05/22 05:19

#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

 

原创粉丝点击