数据结构之单链表的简单操作(插入 删除 查找 撤销 打印)

链接表首先要建立指针域和数据域,并用本节点的指针域指向下一个节点,对于链表的特点这里不做详细解释
1.建立指针域和数据域

typedef struct Noded{
	struct Noded *next;//指针域 
	int data;//数据域 
}Noded; 

2.对链表进行初始化,链表为空(确保建立空链表)

//链表初始化 
void Init(Noded *head){
	head->next = NULL;
}

3.实现链表的各种操作
插入:采用头插法:链表为空时,head指向NULL;链表不为空时,head指向第一个节点,插入时,p的next指向head的next,head的next指向p。

//头插法建立链表 
void headInsert(Noded *head,int x){
	Noded *p;
	p = (struct Noded*)malloc(sizeof(struct Noded));
	p->data = x;
	p->next = head->next;
	head->next = p;
	
} 

得到链表的长度,对链表进行遍历即可

//得到链表长度 
int getLen(Noded *head){
	Noded *cur = head->next;
	int count=0;
	while(cur != NULL){
		count++;
		cur = cur->next;
	}
	return count;
} 

插入:在下标 k 的位置插入,移动链表指针到 k 的位置,进行插入

//在下标为k的位置插入元素 x 
void insert(Noded *head, int k, int x){
	Noded *cur,*p;
	int i;
	p = (struct Noded*)malloc(sizeof(struct Noded));
	p->data = x;
	cur = head;
	for(i = 0; i < k; i++) {
		cur = cur->next;
	}
	p->next = cur->next;
	cur->next = p;
	
}

删除:删除下标为 k 的元素,先遍历到 k 位置,再删除即可

//删除下标为 k 的元素 
void dele(Noded *head,int k){
	Noded *cur = head;
	int i;
	for(i = 0; i < k; i++){
		cur = cur->next;
	}
	cur->next = cur->next->next;
	
} 

查找:查找元素值为 x 的节点,并返回其下标 ,直接从第一个节点开始遍历,知道找到值为 x 的元素,记录此时已经遍历的元素个数,返回即可。如果链表不存在此元素,则返回-1。

//查找元素值为 x 的节点,并返回其下标 
int search(Noded *head,int x){
	Noded *cur = head->next;
	int i = 0;
	while(cur!=NULL){
		if(x == cur->data)
		return i;
		i++;
		cur = cur->next;
	} 
	return -1;
}

打印

//打印链表 
void print(Noded *head){
	if(head==NULL)
	return;
	Noded *cur = head->next;
	while(cur!=NULL){
		printf("%d ",cur->data);
		cur = cur->next;
	}
}

撤销链表

//撤销链表 
void destory(Noded *head){
	Noded *cur = head->next;
	while(cur!=NULL){
		free(cur);
		cur = cur->next;
	}
}

完整代码如下

#include <stdio.h>
#include <stdlib.h>

typedef struct Noded{
	struct Noded *next;//指针域 
	int data;//数据域 
}Noded; 

//链表初始化 
void Init(Noded *head){
	head->next = NULL;
}

//头插法建立链表 
void headInsert(Noded *head,int x){
	Noded *p;
	p = (struct Noded*)malloc(sizeof(struct Noded));
	p->data = x;
	p->next = head->next;
	head->next = p;
	
} 

//得到链表长度 
int getLen(Noded *head){
	Noded *cur = head->next;
	int count=0;
	while(cur != NULL){
		count++;
		cur = cur->next;
	}
	return count;
} 

//在下标为k的位置插入元素 x 
void insert(Noded *head, int k, int x){
	Noded *cur,*p;
	int i;
	p = (struct Noded*)malloc(sizeof(struct Noded));
	p->data = x;
	cur = head;
	for(i = 0; i < k; i++) {
		cur = cur->next;
	}
	p->next = cur->next;
	cur->next = p;
	
}
//打印链表 
void print(Noded *head){
	if(head==NULL)
	return;
	Noded *cur = head->next;
	while(cur!=NULL){
		printf("%d ",cur->data);
		cur = cur->next;
	}
}

//删除下标为 k 的元素 
void dele(Noded *head,int k){
	Noded *cur = head;
	int i;
	for(i = 0; i < k; i++){
		cur = cur->next;
	}
	cur->next = cur->next->next;
	
} 

//查找元素值为 x 的节点,并返回其下标 
int search(Noded *head,int x){
	Noded *cur = head->next;
	int i = 0;
	while(cur!=NULL){
		if(x == cur->data)
		return i;
		i++;
		cur = cur->next;
	} 
	return -1;
}

//撤销链表 
void destory(Noded *head){
	Noded *cur = head->next;
	while(cur!=NULL){
		free(cur);
		cur = cur->next;
	}
}

int main(int argc, char *argv[]) {
	Noded *node, *node1;
	Init(node);       
	int i;
	for(i = 0; i < 7; i++){
		headInsert(node,i);
		//tailInsert(node,i);
	}
	
	print(node);
	printf("\n");
	insert(node,5,9);
	print(node);
	//print(node);
	printf("\n%d\n",getLen(node));
	printf("%d\n",search(node,9));
	dele(node,5);
	print(node);
	
	
}

猜你喜欢

转载自blog.csdn.net/qq_43060759/article/details/83019795