头插法,尾插法,创建单链表,然后删除所有结点值为x的结点

头插法,尾插法,创建单链表,然后删除所有结点值为x的结点

实现代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode;
//头插法 
void Create1(LNode *&L,int a[],int n){
	LNode *p;
	int i;
	L=(LNode*)malloc(sizeof(LNode));
	L->data=a[0];
	L->next=NULL;
	for(i=1;i<n;i++){
		 p=(LNode*)malloc(sizeof(LNode));
 		 p->data=a[i];
		 p->next=L->next;
		 L->next=p;
	}
}
//尾插法 
void Create2(LNode *&L,int a[],int n){
	LNode *r,*s;
	int i;
	L=(LNode*)malloc(sizeof(LNode));
	L->data=a[0];
	r=L;
	L->next=NULL;
	for(i=1;i<n;++i){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=a[i];
		r->next=s;
		r=s;//或者这样r=r->next;
	}
	r->next=NULL;
}
void Delete_x(LNode *&L,int x){
	LNode *p;
	if(L==NULL)
		return;
	if(L->data==x){
		p=L;
		L=L->next;
		free(p);
		Delete_x(L,x);
	}else{
		Delete_x(L->next,x);
	}
}
void ShowL(LNode *L){
	while(L!=NULL){
		printf("%d ",L->data);
		L=L->next;
	}	 	
}
int main(int argc, char *argv[])
{
	int i,a[5]={1,3,4,1,7},b[5]={1,3,4,1,7};
	LNode *L1=NULL,*L2=NULL;
	Create1(L1,a,5);//头插法创建单链表 
    Create2(L2,b,5);//尾插法创建单链表 
	Delete_x(L1,1);//删除所有的1 
	Delete_x(L2,1);//删除所有的1 
	ShowL(L1);
	printf("\n");
	ShowL(L2);
	printf("\n");
	return 0;
}
输出结果:

7 4 3
3 4 7
请按任意键继续. . .




头插法是一种在链表头部插入元素的方法,相比尾插法头插法更加高效,因为不需要遍历整个链表。 下面是一个带头结点单链表头插法的实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 创建带头结点单链表 ListNode *createList() { ListNode *head = (ListNode *) malloc(sizeof(ListNode)); // 创建结点 head->next = NULL; // 头结点的 next 指针指向 NULL return head; } // 在头部插入节点 void insertAtHead(ListNode *head, int val) { ListNode *newNode = (ListNode *) malloc(sizeof(ListNode)); // 创建新节点 newNode->val = val; // 设置新节点的值 newNode->next = head->next; // 新节点的 next 指针指向原来的第一个节点 head->next = newNode; // 头结点的 next 指针指向新节点 } // 打印链表 void printList(ListNode *head) { ListNode *p = head->next; while (p != NULL) { printf("%d ", p->val); p = p->next; } printf("\n"); } int main() { ListNode *head = createList(); // 创建结点 insertAtHead(head, 3); // 在头部插入节点 insertAtHead(head, 2); insertAtHead(head, 1); printList(head); // 打印链表 return 0; } ``` 上述代码,`createList()` 函数用于创建带头结点单链表,`insertAtHead()` 函数用于在头部插入节点,`printList()` 函数用于打印链表。在 `main()` 函数,我们先创建了一个带头结点单链表,然后在头部插入了三个节点,最后打印出链表的所有节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值