数据结构复习——————单链表的各种操作(带头节点的初始化方法)
程序员文章站
2022-06-04 09:12:58
...
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
//每次均在头节点之后插入元素
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
LNode* s;
int x;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
//从表头到表尾正向建立单链表,每次均在表尾插入元素
// LNode* L;
L=(LNode*)malloc(sizeof(LNode));
LNode* s;
LNode* r;
s=L;
int x;
scanf("%d",&x);
while(x!=9999){
// s=(LNode*)malloc(sizeof(LNode));
r=(LNode*)malloc(sizeof(LNode));
r->data=x;
s->next=r;
s=r;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//按序号查找节点值
LNode *GetElem(LinkList L,int i){
LNode* s;
s=(LNode*)malloc(sizeof(LNode));
s=L->next;
if(i<1) return NULL;
if(i==0) return L;
int j=0;
while(s&&j<i-1){
s=s->next;
j++;
}
return s;
}
//按值查找
void LocateElem(LinkList L,int e){
LNode* s;
// s=(LNode*)malloc(sizeof(LNode));
s=L->next;
int i=1;
while(s&&s->data!=e){
s=s->next;
i++;
}
if(s)
printf("该节点在链表的第%d个位置\n",i);
else
printf("该节点不存在!\n");
}
//插入节点操作
void InsertLNode(LinkList &L,int e,int i){
LNode* s;
// s=(LNode*)malloc(sizeof(LNode));
LNode* r;
r=(LNode*)malloc(sizeof(LNode));
s=L->next;
int j=1;
while(s&&j<i-1){
s=s->next;
j++;
}
r->data=e;
r->next=s->next;
s->next=r;
}
//输出表
int PrintList(LinkList L){
LNode* s;
// s=(LNode*)malloc(sizeof(LNode));
s=L->next;
while(s){
printf("%d->",s->data);
s=s->next;
}
printf("NULL\n");
}
int main(){
LinkList L;
// List_HeadInsert(L);
List_TailInsert(L);
printf("该链表的数据情况如下:\n");
PrintList(L);
printf("找到第一个结点的数据为%d",GetElem(L,1)->data);
printf("插入一个结点在第三个结点后面,其值为1 \n");
InsertLNode(L,1,4);
printf("插入后的链表的数据的情况为:\n");
PrintList(L);
printf("按值查找值为5的结点 \n");
LocateElem(L,5);
}
头插法插入结点的实现各种链表的操作的效果图:
尾插法实现单链表的各种操作:
上一篇: 数据结构复习6, 堆,堆排序
下一篇: 荀彧为曹操出谋划策,最后为何被逼自杀?