#include<stdio.h>
#include<stdlib.h> //malloc、free函数的头文件
typedef int ElemType;
typedef struct LNode{ //定义单链表结点类型
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;//使用LNode *强调这是一个结点;使用LinkList强调这是一个单链表
//1.初始化一个空的单链表(不带头结点)
bool InitList(LinkList &L){
L = NULL; //空表,暂时还没有任何结点(防止脏数据)
return true;
}
//2.采用头插法建立一个单链表
LinkList List_HeadInsert(LinkList &L){ //逆向建立单链表
LNode *s;
int x;
L = NULL; //初始为空表
printf("请输入链表:(当输入9999是结束输入)\n");
scanf("%d",&x); //输入结点的值
while(x!=9999){ //输入9999表示结束
s = (LNode *)malloc(sizeof(LNode)); //创建新结点
s->data = x;
s->next = L;
L = s;
scanf("%d",&x);
}
return L;
}
//3.尾插法建立单链表(不带头结点)
LinkList List_TailInsert(LinkList &L){
L = NULL;//初始化单链表,头指针L指向NULL
LNode *s;//待插入新结点
LNode *r = L;//r为表尾指针
int x;//待插入新结点元素值
printf("请输入链表:(当输入9999是结束输入)\n");
scanf("%d",&x);//输入新结点
while(x != 9999){//输入9999表示插入结束
s = (LNode *)malloc(sizeof(LNode));//创建新结点
s -> data = x;//新结点赋值
if(L == NULL){//插入第一个结点时需要特殊处理
L = s;
r = s;
}else{
r -> next = s;
r = s;//r指向新的表尾结点
}
scanf("%d",&x);
}
r -> next = NULL;//尾结点指针置空
}
//4.在第i个位置插入元素e(不带头结点)
bool ListInsert(LinkList &L,int i,int e){
if(i<1)
return false;
if(i==1){ //插入在第1个结点的操作与其它结点不同
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
}
LNode *p; //指针p指向当前扫描的结点
int j=1; //当前p指向的是第几个结点
p = L; //p指向第1个结点(注意:不是头结点)
while(p!=NULL&&j<i-1){ //循环找到第i-1个结点
p = p->next;
j++;
}
if(p==NULL) //i值不合法(超出单链表长度)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode)); //创建一个新结点存储元素e
s->data = e;
//在p的后面插入s
s->next = p->next;
p->next = s; //将s连到p的后面
return true; //插入成功
}
//5.删除第i个结点,并把值带回(找第i-1个结点)
bool ListDelete(LinkList &L,int i,int &e){ //&e为了把e的值带回去
if(i<1)
return false;
LNode *p; //指针p指向当前扫描的结点
int j = 1; //当前p指向的是第几个结点
p = L; //p指向第1个结点(注意:不是头结点)
while(p!=NULL&&j<i-1){ //循环找到第i-1个结点
p = p->next;
j++;
}
if(p==NULL) //i值不合法(超出单链表长度)
return false;
if(p->next == NULL) //第i-1个结点后已无其它结点
return false;
LNode *q = p->next; //用q指向被删除结点
e= q->data;
p->next = q->next; //将*q从链中“断开”
free(q); //释放结点的存储空间
return true; //删除成功
}
//打印单链表
void PrintList(LinkList L) {
LNode *p; //创建一个指针p
p = L; //p指向第一个结点
printf("链表为:\n");
while (p != NULL) { //判断p是否为空
printf("%d ", p->data); //依次输入p的数据
p = p->next; //指针p每循环一次指向下一个结点元素
}
printf("\n");
}
int main(){
LinkList L;//声明一个指向单链表的指针(注意,此处并没有创建结点)
int e; //声明变量e来存储被删除的结点
InitList(L);
List_HeadInsert(L);
// List_TailInsert(L);
ListDelete(L,3,e);
printf("被删除结点的值为:%d\n",e);
PrintList(L);
return 0;
}
不带头结点的单链表的相关操作
最新推荐文章于 2024-11-06 08:56:39 发布