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

链表结点的定义:

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;//链表最后一个指针为NULL
	return 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值