【数据结构】线性表的链式存储(一)单链表

线性表链式存储的单链表

代码收获:

  • 想遍历链表一般新建一个指针跟着遍历移动,如果需要插入或者删除操作,还需要新建个指针指向循环时候的前一个结点。
  • getchar()最后敲的回车会卡进缓存里,需要继续用一次getchar()把回车给吃了。
  • 初始化如果不想返回指针的话使用二级指针,函数内等于一步分配空间的操作给二级的一级指针明确了地址指向。

线性表归档

线性表顺序存储
线性表链式存储一——单链表
线性表链式存储二——循环链表
线性表链式存储三——双向链表
线性表链式存储四——静态链表

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

typedef struct Node{
	char data;
	struct Node *next;
}Node,*Nodep;

void Initial(Nodep *L){//初始化 
	*L=(Nodep)malloc(sizeof(Node));
	(*L)->next = NULL;
}

void TailInsert(Nodep L){//尾插法 
	printf("请输入要插入的数据,$结束\n");
	char c; 
	int flag;
	flag = 1;
	while(flag){
		c=getchar();
		if(c!='$'){
			Nodep pNode,tail,pre;
			pNode = (Nodep)malloc(sizeof(Node));
			pNode->data = c;
			pNode->next = NULL;
			tail=L->next;
			pre =L;
			while(tail!=NULL){
				pre = tail;
				tail = pre->next;
			}//pre为尾
			pre->next=pNode;	
		}
		else{
			flag=0;
		}	
	}
}
void HeadInsert(Nodep L){//头插法 
	printf("请输入要插入的数据,$结束\n");
	Nodep pNode;
	char c;
	int flag;
	flag = 1;
	while(flag){
		c=getchar();
		if(c!='$'){
			pNode=(Nodep)malloc(sizeof(Node));
			pNode->data=c;
			pNode->next=L->next;
			L->next=pNode;
		}
		else{
			flag=0;
		}
	}		
}

int DeleteNode(Nodep L,char s){//删除第一个找到的指定节点
	Nodep tail,pre;
	tail=L->next;
	pre = L;
	if(tail!=NULL){
		while(tail->next!=NULL){
			if(tail->data==s){
				pre->next = tail->next;
				free(tail);
				return 0;
			}
			else{
				pre = tail;
				tail=tail->next;	
			}
		}
	}
	printf("未找到删除数据\n");
	return -1;
}
int DeleteIndex(Nodep L,int k){//删除指定索引 
	int num;
	Nodep tail,pre;
	num=1;
	tail=L->next;
	pre = L;
	if(tail!=NULL){
		do{
			if(num==k){
				pre->next=tail->next;
				free(tail);
				return 0;
			}
			else{
				pre =tail;
				tail=tail->next;
				num++;
			}
		}while(tail->next!=NULL);
	}
	printf("未找到删除数据\n");
	return -1;
}

void Printlist(Nodep L){//打印链表 
	Nodep pp;
	pp = L->next;
	printf("链表为\n"); 
	while(pp!=NULL){
		printf("%c",pp->data);
		pp=pp->next;
	}
	printf("\n"); 
} 
int Length(Nodep L){//求链表长度
	int num;
	Nodep tail;
	num=0;
	for(tail=L;tail->next!=NULL;tail=tail->next){
		num++;
	} 
	return num;
} 
void main(){
	Nodep L;
	char s='s';//删除节点s 
	Initial(&L);
	TailInsert(L);
	getchar();//吃掉回车 
	HeadInsert(L);
	getchar();//吃掉最后的回车 
	Printlist(L);
	DeleteNode(L,s);
	Printlist(L);
	int k=3;//要删除的索引 
	DeleteIndex(L,k);
	Printlist(L);
	int num;
	num= Length(L);
	printf("长度为%d",num);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业火之理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值