c语言数据结构之单链表基本操作

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

#define ERROR 0
#define OK 1

typedef int Status;
typedef int ElemType;

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

// 对链表进行初始化
Status InitList_L(LinkList &L){
	L = (LNode *)malloc(sizeof(LNode));
	if(L == NULL) return ERROR;
	L->next = NULL;
	return OK;
}
// 插入数据
Status ListInsert_L(LinkList &L, int i, ElemType e){
	LNode *p=L,*s;
	int j=0;
	while(p && j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p||j>i-1) return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;
}
// 头插法
Status ListPreInsert(LinkList &L, int i, ElemType e){
	if(i < 1) return ERROR;
	int j = 1;
	LinkList s = (LNode *)malloc(sizeof(LNode));
	if(s == NULL) return ERROR;
	LinkList p = (LNode *)malloc(sizeof(LNode));
	p = L;
	while(p != NULL && j < i){
		p = p->next;
		j++;
	}		
	s->next = p->next;
	p->next = s;
	s->data = p->data;
	s->data = e;
	return OK;
}
// 尾插法
Status ListEndInsert(LinkList &L, int i, ElemType e){
	if(i < 1) return ERROR;
	int j = 1;
	LinkList s = (LNode *)malloc(sizeof(LNode));
	if(s == NULL) return ERROR;
	LinkList p = (LNode *)malloc(sizeof(LNode));
	p = L->next;
	while(p != NULL && j < i){
		p = p->next;
		j++;
	}
	s->data=e;		
	s->next = p->next;
	p->next = s;
	return OK;
}
// 删除数据
Status ListDelete_L(LinkList L, int i, ElemType &e){
	LNode *p;
	p = L; int j = 0;
	while(p && j < i - 1){
		p = p->next;
		j++;
	}
	if(!p->next) return ERROR;
	LinkList q;
	q = p->next;
	p->next = q->next;  
	e = q->data;
	free(q);
}
// 查询数据是否存在
Status LocateElem_SL(LinkList L, ElemType e){
	LinkList p;
	p = L->next;
	while(p != NULL && p->data != e)
		p = p->next;
	if (p->data){ 
		e = p->data;
		printf("数据中存在:%d\n", e);
	}
	return OK;
}
// 计算链表长度
Status ListLength(LinkList L){
	int len = 0;
	LinkList p;
	p = L;
	while(p->next != NULL){
		p = p->next;
		len++;
	}
	printf("线性表长度是:%d", len);
	return OK;
}
// 打印数据
Status GetElem_L(LinkList L){
	LNode *p = L->next;
	while(p != NULL){
		printf("%d ", p->data);
		p = p->next;
	}
	return OK;
}

int main() {
	LinkList L;
	InitList_L(L);
	while (true){
		printf("请输入插入数据的个数:\n");
		int n;
		scanf("%d", &n);
		printf("请输入要插入的数据:\n");
		CreatList_L(L,n);
		printf("打印结果如下:\n");
		GetElem_L(L);
		printf("\n");
		ListInsert_L(L, 3, 25);
		GetElem_L(L);
		printf("\n");
		printf("请输入要插入之前的元素位置:\n");
		int pn, pnum;
		scanf("%d %d", &pn, &pnum);
		ListPreInsert(L, pn, pnum);
		GetElem_L(L);
		printf("\n");
		printf("请输入要插入之后的元素位置:\n");
		int m, num;
		scanf("%d %d", &m, &num);
		ListEndInsert(L, m, num);
		GetElem_L(L);
		printf("\n");
		ListLength(L);
		printf("\n");
		int ch;
		scanf("%d", &ch);
		LocateElem_SL(L, ch);
		InitList_L(L);
		printf("\n");
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。C语言中实现单链表基本操作包括:创建链表、插入节点、删除节点、查找节点、遍历链表等。其中,插入节点和删除节点是单链表的核心操作。在插入节点时,需要先找到要插入位置的前一个节点,然后将新节点插入到该节点之后;在删除节点时,需要先找到要删除节点的前一个节点,然后将该节点从链表中删除。以下是单链表基本操作代码示例: 1. 创建链表 ``` LinkList CreateList() { LinkList L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; return L; } ``` 2. 插入节点 ``` bool ListInsert(LinkList L, int i, ElemType e) { if (i < 1) { return false; } LNode *p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL) { return false; } LNode *s = (LNode *)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return true; } ``` 3. 删除节点 ``` bool ListDelete(LinkList L, int i, ElemType &e) { if (i < 1) { return false; } LNode *p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL || p->next == NULL) { return false; } LNode *q = p->next; e = q->data; p->next = q->next; free(q); return true; } ``` 4. 查找节点 ``` LNode *GetElem(LinkList L, int i) { if (i < 1) { return NULL; } LNode *p = L->next; int j = 1; while (p != NULL && j < i) { p = p->next; j++; } return p; } ``` 5. 遍历链表 ``` void TraverseList(LinkList L) { LNode *p = L->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值