C语言实现单链表增删改查实例

单链表的增删改查实例 

  1. 注意:使用链表的插入与删除时要严格注意所插入或者删除元素在本链表中的边界问题,
  2. 同时也要注意链表的判空问题,
  3. 注意链表指针最后一定要指向NULL
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct Node {
	//结构体定义结点
	int data;
	Node *next;
}*LinkedList;//结构体指针LinkedList

void InitLinkedList()//初始化 
{
	Node * L;//定义头结点
	L = (Node *)malloc(sizeof(Node));
	if (L == NULL)
		printf("申请空间失败\n");
	L->next = NULL;
}

LinkedList  CreateLinkedListHead(int n)//头插法
{
	int i;
	int x;
	Node *L;
	L = (Node*)malloc(sizeof(Node));
	L->next = NULL;
	printf("请输入元素:\n");
	for (i = 0; i < n; i++) {
		Node *p = (Node*)malloc(sizeof(Node));
		scanf("%d", &x);
		p->data = x;
		p->next = L->next;
		L->next = p;
	}
	return L;
}

LinkedList CreateLinkedListTail(int n) //尾插法
{
	int x;
	Node *L;
	L = (Node*)malloc(sizeof(Node));
	L->next = NULL;
	Node*r;
	r = L;
	printf("请输入元素:\n");
	while (n--) {
		scanf("%d", &x);
		Node *p;
		p = (Node*)malloc(sizeof(Node));
		p->data = x;
		r->next = p;
		r = p;
	}
	r->next = NULL;
	return L;
}
int  GetLength(LinkedList L)//遍历链表求长度
{
	LinkedList p;
	int length = 0;
	p = L->next;//p指向第一个结点
	while (p) {
		printf("链表数据:%d\n", p->data);
		p = p->next;
		length++;

	}
	printf("\n");
	return length;
}
bool InsertLinkedList(LinkedList &L, int i, int e) //插入一个指定位置元素
{
	LinkedList p;
	p = L;//头指针赋值给p
	int j=1;
	if (i<1 || i>GetLength(L))
	{
		printf("Failed,边界有误\n");
		return false;
	}
	while (p->next!=NULL&&j < i) {//查找第i-1个位置
		p = p->next;
		j++;
	}
	Node *s;//定义插入的结点
	s = (Node*)malloc(sizeof(Node));
	s->data = e;
	s->next = p->next;
	p->next = s;	
	return true;
}

void print(LinkedList L)//遍历链表
{
	Node *p;
	for (p = L->next; p!= NULL; p = p->next) {
		printf("%d\t", p->data);
	}
	printf("\n");
}

bool deleteLinkedList(LinkedList &L, int i)//删除指定位置的元素
{
	LinkedList p, q;
	p = L;
	int j = 1;
	if (i<1 || i>GetLength(L))
	{
		printf("Failed,边界有误\n");
		return false;
	}
	while (p->next != NULL && j < i) {
		p = p->next;
		j++;
	}
	q = p->next;//指向q自己
	p->next = p->next->next;
	free(q);//释放q结点
	return true;
}

int GetElem(LinkedList L, int i)//获取元素
{
	int e;
	int j = 1;
	LinkedList p;
	p = L->next;
	while (p&&j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i) {
		printf("第%d个节点不存在!非法查找0_", i);
		return 0;
	}
	else
		e = p->data;
	return e;
}

void ClearList(LinkedList L)//释放链表
{
	LinkedList p, q;
	p = L->next;
	while (p) {
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
}


int main() {
	int n, i, x;
	LinkedList L;
	InitLinkedList();
	printf("请输入链表长度(头插法):\n");
	scanf("%d", &n);
	L = CreateLinkedListHead(n);
	print(L);
	printf("请输入链表长度(尾插法):\n");
	scanf("%d", &n);
	L = CreateLinkedListTail(n);
	print(L);
	printf("链表长度%d\n",GetLength(L));
	printf("输入要获取哪一位置的元素:\n");
	scanf("%d", &i);
	printf("%d\n", GetElem(L, i));
	printf("输入要插入的元素e与位置i:");
	scanf("%d %d",&x,&i);
	InsertLinkedList(L, i, x);
	print(L);
	printf("输入要删除哪一位置上的元素:");
	scanf("%d", &i);
	deleteLinkedList(L, i);
	print(L);
	printf("\n是否要整表删除1/0?\n");
	scanf("%d", &x);
	if (x == 1)
	{
		ClearList(L);
		printf("单链表为:");
		print(L);
	}
	else
	{
		printf("单链表仍为:");
		print(L);
	}
	return 0;
}

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值