数据结构学习笔记---关于单链表

关于单链表

1.首先是结构体的定义

typedef struct Node
{
	int data;
	struct Node *next;
}Node;
typedef struct Node *LinkList;

表示struct Node 和 Node是等价的。
int data,存储的数据类型。
声明了一个指向struct Node类型的next指针。
同时声明了指向Node结构体的一个LinkList指针。

struct Student
{
	int name;
	int num;
}s1,s2;

定义了一个Student数据类型的结构体,和s1,s2两个结构体变量。

2.关于指针

int *a = NULL;
int b = 3;
a = &b;
printf("%d", *a);

定义了一个指向NULL的指针,并将b的地址赋给a,输出a指向地址里存储的值。
所以:*a代表a指针指向地址存储的值,&b代表取b的地址。
3.初始化链表

Node* InitList()
{
	LinkList head = (Node*)malloc(sizeof(Node));
	if (head==NULL)
		exit(-1);
	 head->next = NULL;
	 printf("创建成功\n");
	 return head;
 } 

定义了初始化函数,返回的是Node类型的头指针。
LinkList head为指向结构体Node的一个指针变量。malloc返回的是void类型,这里强制转换Node,或者LinkList head = (LinkList)malloc(sizeof(Node));
这一句,为指针动态分配内存,生成一个头结点。
将指针域指空,返回head头指针的地址。
//调用函数时,传参为地址。

4.创建,写入数据到链表

	
//void InsertList(LinkList *L, int *a)/*创建链表*///数组传入写法
void InsertList(LinkList *L)/*创建链表*//
{
	LinkList p, q = NULL;int inputnum =0;
	//*L为头结点 
	q = *L;
	while(1)
	{
		puts("请输入数字,输入999停止");
		scanf("%d", &inputnum);
		if (inputnum==999)
			break;
		p = (LinkList)malloc(sizeof(Node));
		p->data = inputnum;
		q->next = p;
		q = p;
	}
	q->next = NULL;//最后一个结点next设为空 
}

参数LinkList L为指向结构体指针LinkList的指针L。调用函数时,L赋值为Init函数返回头指针的地址。
调用时Node *head = InitList();InsertList(&head);
指针L是struct Node的二级指针,head是struct Node的一级指针。L为struct Node
*, head为sturct Node*, 为L赋值需要再取地址一次,所以参数为&head。
相当于Linklist *L = &head,此时 L被赋值head的地址,L指向的是head的地址,*L就是head头结点了。
定义两个指向Node结构体的指针p,q。尾插法p->data,左边p指向结构体的指针进行->操作,循环实现尾插法。最后一个结点的指针域设为NULL。

5.遍历,输出链表

void showLinkList(LinkList *L)//展示链表 
{
	LinkList k= NULL;
	k = (*L);
	while (k->next!=NULL)
	{
		k = k->next;
		printf("%d ", k->data);
	}
}

Node结构体指针k指向头结点。
头结点无数据,所以检查下一个结点有无数据就可以,遍历输出。(*k).data也可以输出。

7.删除指定结点
原理:找到指定结点的前驱结点,将前驱结点指向下下个结点,释放free指定节点,指向NULL。

void dele_appoint(LinkList *L, int num) //删除指定结点 
{
	LinkList current, q= NULL; int n=0;int flag=1;
		current = (*L);//头结点 
	//current 为q的前驱结点 
	while((current->next)&&flag)
	{
		q = current->next;
		if(q->data == num)
		{	
			printf("要删除%d了", q->data);		
			current->next = q->next;
			free(q);
			q = NULL;
			flag = 0;
		}	
		else
		{
			current = current->next;
			flag = 1;
		}	
	}
	if ((flag && current) == 1)	
		printf("找不到");	
}

有错误请指正,感谢浏览o。
结束。今天看静态链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值