数据结构——线性表的基本操作(单链表)

本文介绍了如何使用C语言实现单链表的初始化、头插法创建、查找第i个元素、插入和删除功能。通过实例展示了链表操作的基本流程和关键函数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

#include<stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ERROR
#define OK 
#define ElemType char 


typedef struct Node
{
	ElemType data;
	struct Node* next; 
}Node, *LinkList;


//初始化单链表
InitList(LinkList *L)
{
	* L=(LinkList)malloc(sizeof(Node));		//建立头结点
	(* L)->next=NULL;						//建立空的单链表L
	printf("单链表已初始化\n");

}


//用头插法建立单链表
void GreateFromHead(LinkList L)
{
	Node *s;
	char c;
	int flag=1;
	while(flag)  //flag初始值为1,当输入"$"时, 设置flag为0建表结束
	{
		c=getchar();
		if(c==' ') continue;
		if(c!='$')
		{
			s=(Node*)malloc(sizeof(Node)); //建立新节点
			s->data=c;
			s->next=L->next; //将s结点插入表头
			L->next=s;
		}
		else flag=0;
	}
}


//查找   获得第i个数据元素  
Node * Get(LinkList L,int i)
{
	int j;
	Node *p;
	if(i<=0) return NULL;
	p=L;j=0;   //从头结点开始扫描
	while(p->next!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	if(i==j) return p;
	else return NULL;
	
}


//在链表中插入数据元素 
void InsList(LinkList L,int i,ElemType e)
{
	Node *pre,*s;
	int k;
	if(i<=0)
	{
		printf("插入位置必须大于0!");
		return ERROR;
	}
	pre=L; k=0;    //从头开始查找,查找i-1个结点
	while(pre!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre==NULL)
	{
		printf("插入位置不合理!");
		return ERROR;
	}
	s=(Node *)malloc(sizeof(Node));
	s->data=e;
	s->next=pre->next;
	pre->next=s;
	return OK;
}

//在链表中删除数据元素 
int DelList(LinkList L,int i)//, ElemType *e
{
	Node *pre,*r;
	int k;
	pre=L;k=0;
	while(pre->next!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre->next==NULL)	return NULL;
	r=pre->next;
	pre->next=r->next;
	//*e=r->data;
	free(r);
	return OK;

}


void main()
{
	LinkList l;
	Node *p;
	int i,choose,cycle=1;
	char e;	
	//设置颜色
	system("color 2F");
	InitList(&l);
	while(cycle){ 
		printf("请输入要执行的操作:\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t1.    建表    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t2.    查询    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t3.    插入    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t4.    删除    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		printf("\t|\t5.    退出    \t\t\t|\n");
		printf("\t-----------------------------------------\n");
		scanf("%d",&choose);
		switch (choose)
		{
		case 1://建表
			system("cls");
			printf("用头插法建立单链表,请输入链表数据,以$结束!\n");
			GreateFromHead(l);
									/*while(l->next!=NULL)
									{
										printf("%c ",l->data); //为什么此方法输出有问题?????
										l=l->next;
									}*/
			p = l->next;
			while(p!=NULL)
			{
				printf("%c ",p->data);
				p=p->next;
			}
			system("pause");
			break;
		case 2://查询
			system("cls");
			printf("请输入要查找的第i个元素:");
			scanf("%d",&i);
			p=Get(l,i);
			if(p==NULL)
			{
				printf("未查到该元素\n");
				system("pause");
				continue;
			}
			printf("查找的第%d元素为:%c \n",i,p->data);
			system("pause");
			break;	
		case 3://插入
			system("cls");
			printf("请输入插入的位置和元素(请用空格隔开):");
			scanf("%d %c",&i,&e);
			InsList(l,i,e);
			printf("插入后为的链表为:");
			p = l->next;
			while(p!=NULL)
			{
				printf("%c ",p->data);
				p=p->next;
			}
			system("pause");
			break;
		case 4://删除
			system("cls");
			printf("请输入要删除的位置:");
			scanf("%d",&i);
			//e = (char*)malloc(sizeof(char));
			p=DelList(l,i);
			if(p==NULL)
			{
				printf("删除的位置不合理");
			}else{
				printf("删除后为的链表为:");
				p = l->next;
				while(p!=NULL)
				{
					printf("%c ",p->data);
					p=p->next;
				}
			}	
			system("pause");
			break;
		case 5:
			cycle=0;
			printf("RZH欢迎您再次使用:\n");
			break;
		default	:
			printf("输入有误,RZH求您再次输入:\n");
			system("pause");
			system("cls");
			continue;
		}

	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值