单链表的插入和删除

 //单链表的插入和删除         单链表就是线性链表
#include <stdio.h> 
#include<malloc.h>    //动态存储分配
typedef struct Lnode
{
	int data;
    struct Lnode *Link;
}Lnode,*Linklist;
Linklist create(int n)
{
	Linklist list=(Linklist)malloc(sizeof(Lnode));    //为指针list申请空间   list链表
	Lnode *p,*q;
	int x,i;
	p=list;   //p指向表头
	for(i=1;i<=n;i++)
	{
		q=(Linklist)malloc(sizeof(Lnode));
		scanf("%d",&x);   //x为表中数据
		q->data=x;    //将数据x复制给q指向的数据域
		p->Link=q;    //q指向p的下一个节点
		p=q;         //让p指向q
	}
	p->Link=NULL;          //最后一个节点的指针域为空
	list=list->Link;          //多个
    printf("success!\n");
	return list;               //返回一个表
	
}
int insert(Linklist &list,int i,int x)     //list为表头,第i个位置,x为插入的数
{
	Linklist p,q;
	int j=1;
	p=list;
    while(p!=NULL && j<i-1) //p非空且j在下标范围之内       寻找第i个结点
    { 
		p=p->Link;
        j++;         //j计数      j为p要插入的位置,在i之后	
    }
    if(p==NULL||j>i)      //p为空或者j超出下标 都插入失败     带入数不成立才可进行下步
	{ 
		printf("无法插入");
        return 0;
	}
	if(i!=1)
    {
		q=(Linklist)malloc(sizeof(Lnode));     //为q申请新空间
        q->data=x;                       //将x赋给q指向的数据域
        q->Link=p->Link;              //
        p->Link=q;                    //将新链结点插在第i个结点之后   p->Link为p的后一个结点,所以p在前,q在后
	    printf("success!\n");
        return 1;
	}
	else
	{
		q=(Linklist)malloc(sizeof(Lnode));     //为q申请新空间
        q->data=x;                       //将x赋给q指向的数据域
		q->Link=list;
		list=p;
		return 1;
	}

}
void show(Linklist list)
{
	
	while(list)
	{
		printf("%d\t",list->data);
	    list=list->Link;
	}
	printf("\n");
	/*if(list==NULL)
		printf("表为空\n");*/

}
int delet(Linklist &list,int i)
{
	Linklist p,q;
	int j=1,item;
	p=list;
    while(p->Link && j<i-1)
	{ 
		p=p->Link ;
        ++j;
    }
    if(!(p->Link)||j>i-1)    //当p->next不为空或j超出下标范围
	{ 
		printf("无法删除");
        return 0;
	}
    q=p->Link ;
	p->Link =q->Link;
    item=q->data;            //将要删除的结点的数值保存下来
    free(q);
    return 1;
}

void main()
{
	Linklist list;
	list=NULL;
	int n,x,i,m=2;
	printf("please input n:\n");
	scanf("%d",&n);
	printf("创建单链表\n");
	list=create(n);    //一开始list为空,所以创建后要赋值给list
    show(list);

    printf("输入插入位置和插入数据\n");
	scanf("%d%d",&i,&x);
	insert(list,i,x);
    show(list);
	
	printf("\n");
    printf("删除第%d个数据\n",m);
	delet(list,m);
	show(list);
	
}

结果

 

 

### 单链表插入删除节点的方法 #### 插入节点 在单链表插入新节点通常涉及找到合适的位置并更新相邻节点之间的链接。以下是具体过程: 对于头部插入的情况,在已有头指针的情况下,创建一个新的节点并将它的`next`设置为当前的头节点,之后更新头指针指向新的节点即可完成操作[^1]。 ```cpp void insertAtHead(Node*& head, int value){ Node* newNode = new Node(); newNode->data = value; newNode->next = head; head = newNode; } ``` 如果是在指定位置之前插入,则需先遍历到目标位置前的一个节点,并调整前后两个节点间的连接关系[^4]。 ```cpp bool insertAfter(Node* prevNode, int newValue) { if (prevNode == NULL) { cout << "the given previous node cannot be NULL"; return false; } Node* newNode = new Node(); // Allocate new node newNode->data = newValue; // Put in the data newNode->next = prevNode->next; // Make next of newNode as next of prev_node prevNode->next = newNode; // Move the next of prev_node as newNode return true; } ``` #### 删除节点 当需要移除某个特定值的第一个匹配项时,可以从头开始逐个比较直到发现相等的数据元素为止。一旦找到了待删去的目标对象,就要修改它前面那个元素所持有的引用使其不再指向即将被释放的对象而是跳过这个对象直接连向后者后面的那部分列表[^5]。 ```cpp void deleteNode(Node *&head_ref, int key) { // Store head node Node* temp = head_ref, *prev; // If head node itself holds the key to be deleted if (temp != NULL && temp->data == key) { head_ref = temp->next; // Changed head free(temp); // Free old head return; } // Search for the key to be deleted, keep track of the // previous node as we need to change 'prev->next' while (temp != NULL && temp->data != key) { prev = temp; temp = temp->next; } // If key was not present in linked list if (temp == NULL) return; // Unlink the node from linked list prev->next = temp->next; free(temp); // Free memory } ``` 上述代码展示了如何处理不同场景下的插入删除动作,无论是作为首元还是中间/末端的新成员加入或是退出队伍都能得到妥善解决[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值