考研 408数据结构代码练习(C语言)——单链表部分

单链表:

根据开发经验,一般对数据的操作也就是**增删改查。**最多外加几个初始化赋值函数。
所有的i都是从第0个开始。这里的“改”没有

首先是定义和初始化函数

这里定义了单链表结构体;两种初始化函数(带头结点和不带头结点)。
初始化链表函数是为了防止内存区域中存在脏数据。

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

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

//零、初始化

bool InitList(LinkList &L){//带头
	L = NULL;
	return true;
}
bool InitListHead(LinkList &L){//不带头
	L = (LNode *) malloc(sizeof(LNode));//分配头结点
	if(L == NULL)// 初始化失败
		return false;
	L->next =NULL;// 头结点后续初始化为空
	return true;
}

然后是插入节点的函数

一共是三种插入
1.带头结点的后继插入
2.无头节点后继插入
3.前驱插入


bool ListInsertHead(LinkList &L,int i,int e){//(带头结点)在第i个位置插入元素e
	if(i<1){
		printf ("插入失败 \n");
		return false;
	}
	LNode *p;
	int j=0;
	p = L;//p指向头节点
	while(p!=NULL && j<i-1){
		p = p->next;
		j++;//当前p指向第几个节点
	}
	if(p==NULL){//i值不合法
		printf ("插入失败 \n");
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	printf ("插入成功,插入节点序号为%d,插入数据为%d\n",j,e);
	return true;
}


bool ListInsert(LinkList &L,int i,int e){//(无头)在第i个位置插入元素e

	if(i<1){
		printf ("插入失败 \n");
		return false;
	}
	if(i==1){ //插入第一个节点
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s; //头指针指向新插入的第一个节点
		return true;
	}
	LNode *p;
	int j=0;
	p = L;//p指向头节点
	while(p!=NULL && j<i-1){
		p = p->next;
		j++;//当前p指向第几个节点
	}
	if(p==NULL){//i值不合法
		printf ("i值不合法,插入失败 \n");
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	printf ("插入成功 \n");
	return true;
}
bool InsertPriorNode(LNode *p,int e){//在p节点之前插入节点

	if(p==NULL){//选择节点为空
		printf ("选择节点为空,插入失败 \n");
		return false;
	}
	LNode *s =(LNode *)malloc(sizeof(LNode));
	s->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e;
	printf ("前插成功,插入数据为%d \n",e);
	return true;
}

删除函数

1.删除第i个位置的节点


int ListDelete(LinkList &L,int i,int &e){//删除指定第i个节点
	if(i<1){
		printf ("i值有误,删除失败 \n");
		return false;
	}
	LNode *p;
	int j=0;
	p = L;//p指向头节点
	while(p!=NULL && j<i-1){
		p = p->next;
		j++;//当前p指向第i-1个节点
	}
	if(p->next == NULL){
		e = p->data;
		free(p);
		printf ("删除成功,删除节点序号为%d,删除数据为%d\n",++j,e);
	}
	if(p==NULL){//i值不合法
		printf ("删除失败 \n");
		return false;
	}
	LNode *s = p->next;
	e = s->data;
	p->next = s->next;
	free(s);
	printf ("删除成功,删除节点序号为%d,删除数据为%d\n",++j,e);
	return e;
}

bool DeleteNode(LNode *p){
	if(p==NULL){//选择节点为空
		printf ("选择节点为空,插入失败 \n");
		return false;
	}

	if(p->next == NULL){
		free(p);
		printf ("删除成功\n");
	}
	LNode *q = p->next; //新建q指向待删除节点p的后继
	p->data = q->data;//p的后继值付给p
	p->next = q->next;//p指向p的后继
	free(q);//释放q
	return true;
}

查找函数


int selectElem(LinkList &L,int data){//返回和data相等的位置i
    LinkList T=L;
    int i=0;
    while (T->next) {
		if (T->data == data) {
            return i;
        }
        T=T->next;
        if (T->data == data) {
            return ++i;
        }
        i++;
    }
    return 2333;
}
int selectAllHead(LinkList L){//遍历
	if(L == NULL)
		return 2333;
    LinkList T=L;
    int i=0;
    while (T) {
		printf("第%d->%d\n",i,T->data);
        T=T->next;
		i++;
    }
	return 1;
}

改就是查到之后赋个值。

直接跑的全部代码

#include <stdio.h>
#include<stdlib.h>
#define max 10
typedef struct LNode{
	int data; 
	struct LNode *next;
}LNode,*LinkList;
void text (int &x ){
	x=100;
}
//零、初始化


bool InitList(LinkList &L){

	L = NULL;
	printf ("初始化成功 \n");
	return true;
}
bool InitListHead(LinkList &L){
	L = (LNode *) malloc(sizeof(LNode));//分配头结点
	if(L == NULL){// 初始化失败
		printf ("初始化失败 \n");
		return false;
	}
	L->next =NULL;// 头结点后续初始化为空
	printf ("初始化成功 \n");
	return true;
}





//一、增

bool ListInsertHead(LinkList &L,int i,int e){//(带头结点)在第i个位置插入元素e

	if(i<1){
		printf ("插入失败 \n");
		return false;
	}
	LNode *p;
	int j=0;
	p = L;//p指向头节点
	while(p!=NULL && j<i-1){
		p = p->next;
		j++;//当前p指向第几个节点
	}
	if(p==NULL){//i值不合法
		printf ("插入失败 \n");
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	printf ("插入成功,插入节点序号为%d,插入数据为%d\n",j,e);
	return true;
}


bool ListInsert(LinkList &L,int i,int e){//(无头)在第i个位置插入元素e

	if(i<1){
		printf ("插入失败 \n");
		return false;
	}
	if(i==1){ //插入第一个节点
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s; //头指针指向新插入的第一个节点
		return true;
	}
	LNode *p;
	int j=0;
	p = L;//p指向头节点
	while(p!=NULL && j<i-1){
		p = p->next;
		j++;//当前p指向第几个节点
	}
	if(p==NULL){//i值不合法
		printf ("i值不合法,插入失败 \n");
		return false;
	}
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	printf ("插入成功 \n");
	return true;
}
bool InsertPriorNode(LNode *p,int e){//在p节点之前插入节点

	if(p==NULL){//选择节点为空
		printf ("选择节点为空,插入失败 \n");
		return false;
	}
	LNode *s =(LNode *)malloc(sizeof(LNode));
	s->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e;
	printf ("前插成功,插入数据为%d \n",e);
	return true;
}




//二、删

int ListDelete(LinkList &L,int i,int &e){//删除指定第i个节点
	if(i<1){
		printf ("i值有误,删除失败 \n");
		return false;
	}
	LNode *p;
	int j=0;
	p = L;//p指向头节点
	while(p!=NULL && j<i-1){
		p = p->next;
		j++;//当前p指向第i-1个节点
	}
	if(p->next == NULL){
		e = p->data;
		free(p);
		printf ("删除成功,删除节点序号为%d,删除数据为%d\n",++j,e);
	}
	if(p==NULL){//i值不合法
		printf ("删除失败 \n");
		return false;
	}
	LNode *s = p->next;
	e = s->data;
	p->next = s->next;
	free(s);
	printf ("删除成功,删除节点序号为%d,删除数据为%d\n",++j,e);
	return e;
}

bool DeleteNode(LNode *p){
	if(p==NULL){//选择节点为空
		printf ("选择节点为空,插入失败 \n");
		return false;
	}

	if(p->next == NULL){
		free(p);
		printf ("删除成功\n");
	}
	LNode *q = p->next; //新建q指向待删除节点p的后继
	p->data = q->data;//p的后继值付给p
	p->next = q->next;//p指向p的后继
	free(q);//释放q
	return true;
}

//三、改
int UpdateElem(LinkList &L,int i,int e){//将第i个节点的数据改为e
    LinkList T=L;
	LNode *p;
    int j=0;
    p = L;//p指向头节点
	while(p!=NULL && j<i-1){
		p = p->next;
		j++;//当前p指向第i-1个节点
	}
	if(p->next == NULL){
		printf ("更新失败\n");
		return 2333;
	}
	p->next->data = e;
	printf ("更新成功\n");
    return 2333;
}

//四、查

int selectElem(LinkList &L,int data){//返回和data相等的位置i
    LinkList T=L;
    int i=0;
    while (T->next) {
		if (T->data == data) {
            return i;
        }
        T=T->next;
        if (T->data == data) {
            return ++i;
        }
        i++;
    }
    return 2333;
}
int selectAllHead(LinkList L){//遍历
	if(L == NULL)
		return 2333;
    LinkList T=L;
    int i=0;
    while (T) {
		printf("第%d->%d\n",i,T->data);
        T=T->next;
		i++;
    }
	return 1;
}
int main()
{
	int i = 1;
	int e = 10; 
	int num[3] = {1,2,3};
	LinkList L;
	InitListHead(L);//带头结点初始化
	

	ListInsertHead(L,i,e);//插入第一个节点
	for(int j=0;j<3;j++){
		ListInsertHead(L,i+j+1,num[j]);//在i后面插入第j+1个节点
		
	}

	LNode *p=L->next->next;
	InsertPriorNode(p,e+1);//插入第2个位置,值为11

	LNode *q=L->next;
	InsertPriorNode(q,e+3);//选择第一1结点前插



	
	selectAllHead(L);//遍历链表
	int se = selectElem(L,3);//查找特定值
	printf ("%d\n",se);

	UpdateElem(L,3,se+100);
	selectAllHead(L);
	

	int ld = ListDelete(L,6,se);//删除第6的节点
	printf ("被删除值为%d\n",ld);
	selectAllHead(L);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值