<单链表>个人对于单链表的理解

7 篇文章 0 订阅
5 篇文章 0 订阅

解释都在代码里;

该代码含头插法尾插法两种方法实现插入结点;

该代码以菜单的方式呈现功能选择;

详细见代码:

#include<stdio.h> 
#include<stdlib.h>		//malloc需要用到该头文件

//1.首先创建一个链表结构------->数据域+指针 
typedef struct NODE
{
	int data;
	struct NODE* next; 
 }LNODE;               //typedef将struct NODE改名为LNODE(结构体类型标识符) 

//2.创建一个表头
LNODE* creatlist()
{
	LNODE* head=(LNODE*)malloc(sizeof(LNODE));              //头节点一般不给数据(也可以拓展让其存储链表长度) 
	head->next=NULL;
	return head;
 } ; 
 
//3.创建一个结点--------->为4.为插入结点作定义 
LNODE* creatNODE(int data)
{
	LNODE* PNODE=(LNODE*)malloc(sizeof(LNODE));
	PNODE->data=data;
	PNODE->next=NULL;
	return PNODE;
};

//4.插入一个结点------------>头插法(head->......、4、3、2、1) 
void insert(LNODE* head,int data)
{
	LNODE* newNODE=creatNODE(data);
	newNODE->next=head->next;             //总是从head->next插入 
	head->next=newNODE; 
 } 

/**///尾插法------(head->1、2、3、4、......)
void wcinsert(LNODE* head,int data) 
{
	LNODE* newNODE=creatNODE(data);
	LNODE* pmove=head;
	while(pmove->next!=NULL)               //总是先遍历完当前链表,使指针指向表尾 
	{
		pmove=pmove->next;
	}
	pmove->next=newNODE;                   //存入表尾 
}

//5.删除一个结点
void del(LNODE* head,int data)
{
	if(head->next==NULL)                     //先判断链表是否为空很有必要 
	{
		printf("该链表为空!\n");
		return; 
	}
	LNODE* P=(LNODE*)malloc(sizeof(LNODE));    //定义一个当前结点指针和上一个结点的指针记录 
	LNODE* PF=(LNODE*)malloc(sizeof(LNODE));
	P=head->next;
	PF=head;
	while(P)                             //判断是否循环完链表 
	{
		if(P->data==data)               //循环直到找到该数据 
		{
			PF->next=P->next;
			free(P);               //------>一定要free释放内存空间,防止地址溢出 
			return ;
		}
		PF=P;
		P=P->next;
	}
	printf("未找到该数据!");
 } 
 
//6.遍历输出
void print(LNODE* head)
 {
 	if(head->next==NULL)
	{
		printf("该链表为空!\n");
		return; 
	}
 	LNODE* Pmove=(LNODE*)malloc(sizeof(LNODE));         //用一个指针来循环整个链表 
 	Pmove=head->next;
 	printf("链表数据如下:\n"); 
 	while(Pmove)
 	{
 		printf("%4d\t",Pmove->data);
 		Pmove=Pmove->next;
	 }
	 printf("\n");
  } 
  
//**7.连续插入结点
int progress(LNODE* head)
{
	int i,n=0,k=0;
	printf("请输入要插入几个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		printf("请输入要插入的第%d个数的值:",i+1);
		scanf("%d",&k);
		//insert(head,k);             //头插法 
		wcinsert(head,k);             //尾插法 
	}
	printf("插入完成!"); 
}

//**8.连续删除结点
void dell(LNODE* head) 
{
	int i,n=0,k=0;
	printf("请输入要删除几个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		printf("请输入要删除的第%d个数的值:",i+1);
		scanf("%d",&k);
		del(head,k); 
	}
	printf("删除完成!"); 
}

void firstface()
{
	printf("/**********************菜单***************************/\n");
	printf("              1.显示菜单\n");
	printf("              2.插入数据\n");
	printf("              3.删除数据\n");
	printf("              4.显示链表中的全部数据\n");
	printf("              5.退出!\n"); 
}

//***************************主程序*********************************// 
void main()
{
	int i=0,j=1;
	LNODE* head=(LNODE*)malloc(sizeof(LNODE));
	head=creatlist();
	firstface(); 
	while(j)
	{
		printf("请输入操作:");
		scanf("%d",&i);
		switch(i)
		{
			case 1:
					firstface();break;
			case 2:
					progress(head);break;
			case 3:
					dell(head);break;
			case 4:
					print(head); break;
			case 5:
					j=0;
					
		}
		
	}
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值