数据结构入门-C语言实现单链表

简述

概念定义

在这里插入图片描述
在这里插入图片描述

相关操作

	InitList(*L): 初始化操作,建立一个空的线性表L。
    GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e。
    LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
    ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e。
    ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值。

代码实现

定义类型

typedef int ElemType;
typedef struct node{
	ElemType data;
	struct node *next;
}Lnode,*LinkList;

具体操作

初始化

头插法

/*头插法初始化链表*/
LinkList InitList(int n)
{
	int i;
	LinkList head, node;//定义头节点,普通节点;
	head = (LinkList)malloc(sizeof(Londe));//分配地址
	head->next = NULL;         
	for (i = 0; i < n; i++) {
		node = (LinkList*)malloc(sizeof(Lnode));
		printf("请输入第%d个结点",i+1);
		scanf("%d",&node->data);
		node->next = head->next;
		head->next = node;
	}
	return head;
}

尾插法

/*尾插法初始化链表*/
LinkList InitList(int n)
{
	int i;
	LinkList head, node, end;//定义头节点,普通节点,尾部节点;
	head = (LinkList)malloc(sizeof(Londe));//分配地址
	end = head;         //若是空链表则头尾节点一样
	for (i = 0; i < n; i++) {
		node = (Lnode*)malloc(sizeof(Lnode));
		printf("请输入第%d个结点",i+1);
		scanf("%d",&node->data);
		end->next = node;
		end = node;
	}
	end->next = NULL;//结束创建
	return head;
}

插入

/*插入第i个,从1开始数*/
int ListInsert(LinkList L,int i,ElemType e)
{
	int index;
	Lnode *t = (Lnode*)malloc(sizeof(Lnode));
	if(i > 0)
	{
		Lnode * p = L;
		for(index=0;index<i && (p!=NULL);index++)
		{
			p = p->next;
		}
		if(p!=NULL)
		{		
			t->data = e;
			t->next = p->next;
			p->next = t;
			return 0;
		}
	}
	printf("超出界限");
	return -1;
}

查找

根据索引查找

/*获取链表第i个*/
ElemType GetElem(LinkList L,int i)
{
	int index;
	Lnode *p = L;
	if(i >= 0)
	{
		for(index=0;index <= i && (p!=NULL);index++)
		{
			p = p->next;
		}		
	}
	if(p==NULL)
	{
		printf("索引越界");
		exit(1);
	}
	else
		return p->data;
}

根据值查找

/*获取链表中某元素所在的位置,只取第一次出现的*/
int LocateElem(LinkList L,ElemType e)
{
	int index = 0;
	while(L->next!=NULL)
	{
		L = L->next;
		if(L->data==*e)
		{
			return index;
		}
		index ++;
	}
	return index;
}

删除

/*删除结点*/
void ListDelete(LinkList L,int n)
{
	Lnode *t,*p = L;
	int i = 0;
	while (i <= n && p != NULL) {
		t = p;
		p = p->next;
		i++;
	}
	if (p != NULL) {
		t->next = p->next;
		free(p);
		p = NULL;
	}
	else {
		printf("节点不存在");
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44112790/article/details/88356032