#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct LNode{
int data; //存放的数据元素
struct LNode *next;//指针指向下一个结点
}LNode,*LinkList;
//LNode *和 LinkList是相同的
//初始化一个空的单链表(带头结点)
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));//之前没有头结点,要申请头结点出来呀
if(L==NULL){//内存不足,分配失败;
return false;
}
L->next = NULL;//头结点之后暂时没有其他结点
return true;
}
//判空(带头结点)
bool Empty(LinkList L){
if(L->next == NULL){
return true;
}else{
return false;
}
}
//按位查找,返回第i个元素(带头结点)
LNode * GetElem(LinkList L ,int index){
if(index<1){
return NULL;
}
LNode *p = L;
int j = 0 ;
while(p!=NULL && j<index){
p = p->next;
j++;
}
return p;
}
//指定结点的后插
bool InsertNextNode(LNode *p,int e){
if(p==NULL){
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
if(s==NULL){//内存分配失败,(可能存在这种情况)
return false;
}
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//按位序插入
bool ListInsert(LinkList &L,int index,int e){
if(index<1){
return true;
}
LNode *p = L;
int j = 0;
while(p!=NULL && j<index-1){//好好理解一下这个index-1的情况
p = p->next;
j++;
}
// LNode *p = GetElem(L,index-1);
// if(p==NULL){//i值不合法!!!!!
// return false;
// }
// LNode *s = (LNode *)malloc(sizeof(LNode));
// s->data = e;
// s->next = p->next;
// p->next = s;
// return true;
//上述注释代码可换成:
return InsertNextNode(p,e);
}
//指定结点的前插操作
bool InsertpriorNode(LNode *p,int e){
if(p==NULL){
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
//按位序删除
bool ListDelete(LinkList &L,int index,int e){
// if(index<1){
// return false;
// }
// LNode *p = L;
// int j = 0;
// while(p!=NULL && j<index-1){
// p = p->next;
// j++;
// }
//上面注释的代码可以改成:(调用函数了)
LNode *p = GetElem(L,index-1);
if(p==NULL){//i值不合法
return false;
}
if(p->next == NULL){//第i-1个结点之后没有其他结点
return false;
}
LNode *q = p->next;
p->next = q->next;
free(q);
return true;
}
//删除指定结点
bool DeleteNode(LNode *p){
if(p==NULL){
return false;
}
LNode *q = p->next;
p->next = q->next;
p->data = q->data;
free(q);
return true;
}
//按值查找
LNode * LocateElem(LinkList L,int e){
LNode *p = L->next;
while(p!=NULL && p->data!=e){
p = p->next;
}
return p;//找到后返回该结点指针
}
//求表长
//自己的想法
int ListLength1(LinkList L){
LNode *p = L->next;
int len = 0;
while(p!=NULL){
len ++;
p = p->next;
}
return len;
}
//视频中的逻辑
int ListLength2(LinkList L){
LNode *p = L;
int len = 0;
while(p->next != NULL){
p = p->next;
len++;
}
return len;
}
//单链表的建立
//尾插法建立链表
LinkList List_TailInsert(LinkList &L) {
L = (LinkList)malloc(sizeof(LNode));//建立头结点
LNode *s,*r = L;
int x;
cin>>x;
while(x!=9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r=s; //使r指向表尾结点
cin>>x;
}
r->next = NULL;//表尾指针置空
return L;
}
//头插法建立链表
LinkList List_HeadInsert(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));//建立头结点
L->next = NULL;//必须要有这一步,内存中可能有脏数据的,不知道指向哪
int x;cin>>x;
while(x!=9999){
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
cin>>x;
}
return L;
}
int main(){
LinkList L;
InitList(L);//函数定义时参数是引用类型,那么传参的时候应该也是引用类型吧?????????????????????????
}
4.数据结构_单链表(带头结点)
最新推荐文章于 2024-07-20 09:21:06 发布