List的简单操作,未完待续

#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

 

在Java中,泛型是一种强类型机制,它可以让你在编译时检查类型错误,从而提高代码的安全性和可读性。在使用泛型时,我们经常会遇到父类和子类的泛型转换问题。 首先,我们需要明确一点:子类泛型不能转换成父类泛型。这是因为Java中的泛型是不协变的。例如,如果有一个类A和它的子类B,那么List<A>和List<B>之间是不存在继承关系的。 下面我们来看一个例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 } } ``` 在这个例子中,我们定义了Animal类和它的子类Dog。然后我们定义了两个List,分别是List<Animal>和List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>和List<Dog>之间不存在继承关系。 那么,如果我们想要让子类泛型转换成父类泛型,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类型,包括父类和子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 下面我们来看一个使用通配符的例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 List<? extends Animal> list3 = new ArrayList<>(); list3 = list2; // 正确 } } ``` 在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类型。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 总结一下,Java中的泛型是不协变的,子类泛型不能转换成父类泛型。如果需要实现子类泛型转换成父类泛型,可以使用通配符来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值