栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言单链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言单链表

C语言单链表 1.单链表的定义 2.单链表的创建

(1)有头结点

(2)没有头结点

(3)带头结点的好处

3.单链表的增删改查

(1)增

头插

尾插

(2)删

(3)改

(4)输出

1.单链表的定义

特点:每个结点除了存放数据元素外,还要存储指向下一个节点的指针

优点:不要求大片连续空间,改变容量方便

缺点:不可随机存取,要耗费一定空间存放指针

用代码定义

 typedef struct node 
 { 
	int date;//定义数据
	struct node *next;定义指针
 }LinkList;
2.单链表的创建

在此之前我想说一下头结点的创建,一般有两种情况。

1.有头结点的情况

有头结点的单链表创建起来比较简单,此时头结点的date里面为空

2.没有头结点的情况

3.带头结点

优势1:第1个位置的插入、删除更加方便,带来操作上的统一

优势2:统一空表和非空表的处理

若使用头结点,无论表是否为空,头指针都指向头结点,也就是*LNode类型,对于空表和非空表的操作是一致的。

若不使用头结点,当表非空时,头指针指向第1个结点的地址,即*LNode类型,但是对于空表,头指针指向的是NULL,此时空表和非空表的操作是不一致的。

所以单链表一般为带头结点的单链表。

为了简便(绝对不是为了偷懒)

LinkList *creat(int n){
	LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
	head = (LinkList*)malloc(sizeof(LinkList));//分配地址
	end = head;         //若是空链表则头尾节点一样
	for (int i = 0; i < n; i++) {
		node = (LinkList*)malloc(sizeof(LinkList));
		scanf("%d", &node->score);
		end->next = node;
		end = node;
	}
	end->next = NULL;//结束创建
	return head;
}
3.单链表的增删改查

(1)增

头插法

LinkList* creattaillink()
{
	LinkList* head = (LinkList*)malloc(sizeof(LinkList));
	head->next = NULL;
	int i;
	while(1) {
		scanf("%d",&i);
		if(i==-1){
		break;//我一般喜欢把-1当作结束的标志
		}
		else{
		LinkList* a = (LinkList*)malloc(sizeof(LinkList));
		a->data = i;
		a->next=head->next;
		head->next = a;
			}
		}
	return head;
}

头插法出来是反的,如果不想反着出来只能用头插法

尾插法

LinkList*creattaillink()
{
	LinkList* head = (LinkList*)malloc(sizeof(LinkList));
	head->next = NULL;
	LinkList*end;
	end=head;
	int i;
	while(1){
	scanf("%d",&i);
	if(i==-1){
	break;
	}
	else{
	LinkList* a = (LinkList*)malloc(sizeof(LinkList));
		a->data = i;
		a->next=NULL;
		end->next=a;
		end=a;
	}
	}
	return head;
}

(2)删

void delet(LinkList *list, int n) {
	LinkList *t = list, *in;
	int i = 0;
	while (i < n && t != NULL) {
		in = t;
		t = t->next;
		i++;
	}
	if (t != NULL) {
		in->next = t->next;
		free(t);
	}
	else {
		puts("节点不存在");
	}
}

(3)改

void change(LinkList *list,int n) {//n为第n个节点
	LinkList *t = list;
	int i = 0;
	while (i < n && t != NULL) {
		t = t->next;
		i++;
	}
	if (t != NULL) {
		puts("输入要修改的值");
		scanf("%d", &t->score);
	}
	else {
		puts("节点不存在");
	}
}

(4)输出

void out(LinkList*head){
	LinkList*end;
	end=head->next;//因为有头结点
	while(end!=NULL){
	printf("%d ",end->x);
	end=end->next;
	}
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号