单链表:
根据开发经验,一般对数据的操作也就是**增删改查。**最多外加几个初始化赋值函数。
所有的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;
}