考研408数据结构代码练习(C语言)——单链表部分-创新互联
单链表:
名称栏目:考研408数据结构代码练习(C语言)——单链表部分-创新互联
分享URL:http://lswzjz.com/article/dcjdce.html
根据开发经验,一般对数据的操作也就是**增删改查。**最多外加几个初始化赋值函数。
所有的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语言)——单链表部分-创新互联
分享URL:http://lswzjz.com/article/dcjdce.html