单向链表的创建、查找、删除、打印

来源:互联网 发布:mysql gtid主从区别 编辑:程序博客网 时间:2024/06/05 09:52

链表结点的定义:

struct ListNode{      int       m_nKey;      ListNode* m_pNext;};

1、单链表的创建

注意要创建头结点

ListNode *create(int *data,int len)//data[]输入的数组,len是输入数组长度{ListNode *head,*p,*q;//定义三个结点,首、中、尾//head=(ListNode*)malloc(sizeof(ListNode));head=new ListNode;//创建头节点int i;for(i=0;i<len;i++){//p=(ListNode*)malloc(sizeof(ListNode));p= new ListNode;//每次插入一个,就新建一个结点p->m_nKey=data[i];if(i==0){head->m_pNext=p;//头结点}else{q->m_pNext=p;}q=p;}q->m_pNext=NULL;//链表最后一个指针为NULLreturn head;}

2、链表打印

void print_ListNode(ListNode *head)  {      ListNode *p;      if(head->m_pNext==NULL)      {          cout<<"链表为空"<<endl;return;      }      p=head->m_pNext;      while(p!=NULL)      {          cout<<p->m_nKey<<" ";          p=p->m_pNext;      } cout<<endl;} 

3、链表结点的删除
要找到删除结点前一结点的位置。从表头开始遍历,发现结点p的m_pNext指向要删除的结点i,于是我们可以把结点p的m_pNext指向i的下一个结点。指针调整后,就可以安全地删除结点i并保证链表没有断开。

如下图所示:


要考虑:删除的结点是第一个结点;删除的结点不是第一个结点;

ListNode *delete_node(ListNode* pListHead, int k)//要删除k,需要找到k值前一个节点{if(pListHead==NULL)return NULL;ListNode *p1=NULL;ListNode *p2=NULL;p1=pListHead;if(p1->m_pNext->m_nKey==k)//删除的结点是第一个节点{p2=p1->m_pNext;pListHead->m_pNext=p2->m_pNext;delete p2;return pListHead;}else                        //删除的结点是第一个节点{while(p1->m_pNext!=NULL){if(p1->m_pNext->m_nKey==k){p2=p1->m_pNext;p1->m_pNext=p2->m_pNext;delete p2;}else{p1=p1->m_pNext;}}}return pListHead;}

主函数如下:

#include<stdio.h>#include<iostream>#include<vector>#include<map>#include<algorithm>using namespace std;struct ListNode{      int       m_nKey;      ListNode* m_pNext;};ListNode *create(int *data,int len);ListNode *FindKthToTail(ListNode* pListHead, int k);void print_ListNode(ListNode *head) ;int main() {int num,n;while(cin>>num){cout<<"输入"<<num<<"个整数:"<<endl;int *data=new int[num];for(int i=0;i<num;i++){cin>>data[i];}ListNode *head,*p;head=create(data,num);cout<<"创建的链表为:"<<endl;print_ListNode(head);cout<<"输入删除的结点:"<<endl;cin>>n;p=delete_node(head,n);cout<<"输入删除的结点后链表为:"<<endl;print_ListNode(p);}    return 0;}



0 0