数据结构 链表操作-头插法/尾插法/查找/删除/打印/新增 结点

/*****************************/
/*    链表和函数定义         */
/*****************************/

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"ctype.h"
typedef struct node				//定义结点
{
	char data[10];				//结点的数据域为字符串
	struct node *next;			//结点的指针域
}ListNode;
typedef ListNode * LinkList;		//自定义LinkList单链表类型
LinkList CreatListR1();			//函数,用尾插入法建立带头结点的单链表
LinkList CreatList(void);			//函数,用头插入法建立带头结点的单链表
ListNode *LocateNode(LinkList,char*);			//函数,按值查找结点
void DeleteList(LinkList,char*);				//函数,删除指定值的结点
void PrintList(LinkList);					//函数,打印链表中的所有值
void DeleteAll(LinkList);					//函数,删除所有结点,释放内存
ListNode * AddNode(LinkList);			//修改程序:增加结点。用头插法,返回头指针

/*****************************/
/*          主函数           */
/*****************************/
int main(){
    char ch[10],num[5];
    LinkList head;
    head=CreatListR1();             //用头插入法建立单链表,返回头指针
    PrintList(head);              //遍历链表输出其值
    printf(" Delete node (y/n):");    //输入"y"或"n"去选择是否删除结点
    scanf("%s",num);
    if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){
        printf("Please input Delete_data:");
        scanf("%s",ch);	        //输入要删除的字符串
        DeleteList(head,ch);
        PrintList(head);
    }
	printf(" Add node ? (y/n):");   //输入"y"或"n"去选择是否增加结点
	scanf("%s",num);
	if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){
		head=AddNode(head);
	}
	PrintList(head);
	DeleteAll(head);            //删除所有结点,释放内存
	return 1;
}

/********************************/
/* 头插入法建立带头结点的单链表 */
/********************************/
LinkList CreatList(void)
{
	char ch[10];
	LinkList head, p;
	head=(LinkList)malloc(sizeof(ListNode)); 
	head->next=NULL;
	while(1)
	{
		printf("Input # to end  ");  
		printf("Please input Node_data:");
		scanf("%s",ch);           
		if(strcmp(ch,"#"))
		{       
			if(LocateNode(head,ch)==NULL) //如果没有字符串是重复的
			{   
				strcpy(head->data,ch);
				//前插法插入新的结点
				p=(LinkList)malloc(sizeof(ListNode)); 
				p->next=head;
				head=p;
			}
		}
		else 
			break;
	}
	return head;        
}

//9 代码编写
/********************************/
/* 尾插入法建立带头结点的单链表 */
/********************************/
LinkList CreatListR1(void)
{
	char ch[100];
	LinkList head, p;//head为头结点,p为首元结点
	head=(LinkList)malloc(sizeof(ListNode)); 
	head->next=NULL;
	LinkList temp=head;
	while(1)
	{
		printf("Input # to end  ");  
		printf("Please input Node_data:");
		scanf("%s",ch);           
		if(strcmp(ch,"#"))
		{       
			if(LocateNode(head,ch)==NULL) //如果没有字符串是重复的
			{   
				//尾插法插入新的结点	
				//遍历到尾结点
				while (temp->next!=NULL) temp=temp->next;
				p=(LinkList)malloc(sizeof(ListNode)); 
				strcpy(p->data,ch);
				p->next=NULL;
				temp->next=p;
			}
		}
		else 
			break;
	}
	return head; 
}

/******************************************************/
/*按值查找结点,找到则返回该结点的位置,否则返回NULL */
/*******************************************************/
ListNode *LocateNode(LinkList head, char *key)
{
	//创建临时结点作为储存
	LinkList temp=head->next;
	while (temp!=NULL)
	{
		//如果有与key匹配的值,就退出循环
		if (strcmp(temp->data,key)==0) break;
		//没有找到就继续找
		else temp=temp->next;
	}
	//找到就返回这个结点的地址,没有找到就返回NULL(循环的方式决定的)
	return temp;
}


/********************************/
/*      修改程序:增加结点      */
/********************************/
ListNode * AddNode(LinkList head)
{
	char ch[100];
	LinkList p,temp=head;
	while(1)
	{
		printf("Input # to end  ");  
		printf("Please input Node_data:");
		scanf("%s",ch);           
		if(strcmp(ch,"#"))
		{       
			if(LocateNode(head,ch)==NULL) //如果没有字符串是重复的,就执行下面的语句
			{   
				//尾插法插入新的结点	
				//遍历到尾结点
				while (temp->next!=NULL) temp=temp->next;
				p=(LinkList)malloc(sizeof(ListNode)); 
				strcpy(p->data,ch);
				p->next=NULL;
				temp->next=p;
			}
		}
		else 
			break;
	}
	return head;
}


/******************************************/
/*    删除带头结点的单链表中的指定结点    */
/******************************************/
void DeleteList(LinkList head,char *key)
{
	//创建临时结点作为储存
	LinkList temp=head->next;
	LinkList above=temp;
	while (temp!=NULL)
	{
		//如果找到相同值,就将前驱结点的next指向后继结点temp->next,并将temp结点删除
		if (strcmp(temp->data,key)==0){
			above->next=temp->next;
			free(temp);
			temp=NULL;
			break;
		} 
		//没有找到就继续找,
		else{ 
			above=temp;	
			temp=temp->next;			
		}
	}
}


/******************************************/
/*               打印链表                 */
/******************************************/
void PrintList(LinkList head)
{
	//创建临时结点作为储存
	LinkList temp=head->next;
	while (temp!=NULL)
	{
		//循环打印数据
		printf("%s\n",temp->data);
		temp=temp->next;
	}
}

/******************************************/
/*          删除所有结点,释放空间        */
/******************************************/
void DeleteAll (LinkList head)
{
	//创建临时结点作为储存
	LinkList temp=head,free_node;
	while (temp!=NULL)
	{
		//用free_node储存即将释放的结点,并将temp指向下一个之后,释放
		free_node=temp;
		temp=temp->next;
		free(free_node);
		free_node=NULL;
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值