#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data; //(数据域)
struct LNode *next; //(指针域)指针指向下一节点
}LNode,*LinkList;
//带头结点的初始化(头结点不会存储数据)
bool InitList_0(LinkList &L){
L=(LNode*)(malloc)(sizeof(LNode)); //分配一个头结点
if(L==NULL)return false; //内存不足,分配失败
L->next=NULL; //初始化头结点之后的结点为空
return true;
}
//在第i个位置插入元素e(带头结点)
bool ListInsert_0(LinkList &L,int i,int e){
if(i<1)return false;
LNode* p; //指针p指向当前扫描到的结点
int j=0; //表示当前p指向的是第几个结点
p=L; //L为头结点第0个结点不存数据
while(p!=NULL&&j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false;//i值不合法
LNode* s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s; //将结点s连到p之后
return true;
}
LinkList List_TailInsert(LinkList &L){//尾插法建立单链表(正向)
int x;
L=(LinkList)malloc(sizeof(LNode));//建立头结点
LNode *s,*r=L; //r为表尾指针
scanf("%d",&x); //输入结点的值
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s; //r指向新的表尾结点
scanf("%d",&x);
r->next=NULL; //尾结点指针置空
return L;
}
}
LinkList List_HeadInsert(LinkList &L){ //头插法建立单链表()
LNode *s; int x;
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=NULL; //初始为空链表
scanf("%d",&x); //输入结点的值
while(x!=9999){ //输入9999表示结束
s=(LNode*)malloc(sizeof(LNode));//创建新结点
s->data=x;
s->next=L->next;
L->next=s; //将新结点插入表中,L指向头结点
scanf("%d",&x);
}
return L;
}
//按位序删除结点(有带头结点)
bool ListDelete(LinkList &L,int i,int &e){
if(i<1)return false;
LNode* p; //指针p指向当前扫描到的结点
int j=0; //表示当前p指向的是第几个结点
p=L; //L为头结点第0个结点不存数据
while(p!=NULL&&j<i-1){ //循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL) return false;//i值不合法
if(p->next==NULL)return false; //第i-1个结点之后已无其他结点
LNode* q=p->next; //令q指向被删除的结点
e=q->data; //用e返回元素的值
p->next=q->next; //将*q结点从链中断开
free(p); //释放结点的存储空间
return true;
}
int main(){
LinkList L; //声明一个指向单链表第一个结点的指针
InitList_0(L);
free(L);
return 0;
}
数据结构(单链表头插法尾插法代码)
于 2024-03-12 16:45:23 首次发布