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

单链表:

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

成都创新互联公司是一家集网站建设,赤坎企业网站建设,赤坎品牌网站建设,网站定制,赤坎网站建设报价,网络营销,网络优化,赤坎网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。首先是定义和初始化函数

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

#include#includetypedef 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 && jp = 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 && jp = 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 && jp = 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#include#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 && jp = 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 && jp = 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 && jp = 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 && jp = 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;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站标题:考研408数据结构代码练习(C语言)——单链表部分-创新互联
本文网址:http://cdiso.cn/article/dcjdce.html

其他资讯