刚入门数据结构不久,自己琢磨的,不喜勿喷,但还是希望高手指点
一、单链表的初始化
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表的初始化
LinkList initList_L(){
// LNode *L;
LinkList L;
/* malloc(sizeof(LNode)) 是使用 malloc 函数动态分配内存,大小为 LNode 结构体所需的字节数,即一个节点所占的内存大小。 */
L=(LinkList) malloc(sizeof(LNode));
if(L==NULL){
exit(0);
}
L->next=NULL;
return L;
}
二、创建单链表
1.头插法
LinkList createList_L(int n){
LinkList L;
int i;
//申请头结点空间
//初始化一个空表
L=(LinkList) malloc(sizeof(LNode));
L->next=NULL;
//逆序插入数据
for(i=n;i>0;i--){
LNode *p;
//给每一个节点申请新的空间
p=(LNode*) malloc(sizeof(LNode));
//给每一个节点赋值
printf("请输入data:");
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
return L;
}
2.尾插法
//尾插法建立单链表
LinkList createList_L_tail(int n){
LinkList L;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LNode *r;//尾指针
r=L;
//正序插入数据
for(i=0;i<n;i++){
LNode *p;
p=(LNode*)malloc(sizeof(LNode));
printf("请输入data:");
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
return L;
}
三、单链表的取值
void GetElem_L(LinkList L,int i,ElemType *e){
// 此处不能为ElemType e;
/* 为了能够获取到链表中指定位置 i 的元素值,您需要将 e 参数修改为指向 ElemType 的指针。这样您就可以在函数中通过指针来修改外部变量的值。 */
LNode *p;
int j=1;
p=L->next;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i){
return;
}
//此处要把值赋值给e,要用*e;
*e=p->data;
}
四、单链表的插入
//单链表插入值为e的元素
void InsertElem_L(LinkList L,int i,ElemType e){
LNode *p=L;int j=0;
//找到i-1的节点
while(p&&(j<i-1)){
p=p->next;
j++;
}
//插入的位置应在1-n之内
if(!p||j>i-1){
return;
}
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
五、单链表的删除
LinkList DeleteElem_L(LinkList L,int i,ElemType *e){
LNode *p=L;int j=0;
//找到i-1的节点
while(p&&(j<i-1)){
p=p->next;
j++;
}
if(!(p->next)||(j>i-1)){
return L;
}
LNode *q;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return L;
}
六、单链表的打印
//打印链表
void printList_L(LinkList L){
//要从首元节点开始打印
//如果未从首元结点,开始便会从头指针开始打印
LNode *p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
}