一、简介
关于数据结构学习的相关代码,是本人在学习过程中,完全根据自己的理解所写的一些基本操作,可能会产生一些错误,但本人写博客的原因只为记录一下个人的学习记录,如有读者看到本人博客有错误的地方,请指正。
二、具体实现
#include<stdio.h>
#include<malloc.h>
//单链表的节点结构
struct Node
{
int date;//数据域
Node *next;//指针域,指向下一下结点的地址
};
//单链表的链表结构
struct NodeLink
{
Node *head;//头指针
int length;//当前链表长度
};
//构建链表的两种方法
//1.头插法
bool buildNode1(NodeLink *nodeLink){
//注,在使用头插法建立链表的时候,一定要重新为头节点分配空间
nodeLink->head = (Node*)malloc(sizeof(Node));
nodeLink->head->next = NULL;
for (int i = 0; i < 10;i++){
Node *s = (Node*)malloc(sizeof(Node));
s->date = 1;
s->next = nodeLink->head->next;
nodeLink->head->next = s;
nodeLink->length++;
}
return true;
}
//单链表尾插法建立链表
bool buildNode2(NodeLink *list){
Node *newNode;//要插入的节点;
Node *last;//始终指向尾部节点
list->head = (Node*)malloc(sizeof(Node));
last = list->head;
for (int i = 0; i < 10;i++){
newNode = (Node*)malloc(sizeof(Node));
newNode->date = i;
last->next = newNode;
last = newNode;
list->length++;
}
last->next = NULL;
return true;
}
//单遍历链表
void showLink(NodeLink *list){
Node *s = list->head;
while (s->next!=NULL){
s = s->next;
printf("%d", s->date);
}
printf("当前链表长度为:%d", list->length);
}
//单链表元素插入
bool insertEle(NodeLink *L,int index,int data){
if (index < 0||index>L->length)
return false;
Node *newNode = (Node*)malloc(sizeof(Node));
Node *p = L->head;//辅助指针
newNode->date = data;
newNode->next = NULL;
//因为有了头节点,节点插入就不需要考虑插入的位置
/*if (index == 0){
newNode->next = p->next;
p->next = newNode;
L->head = p;
L->length++;
return true;
}*/
for (int i = 0; i < index-1;i++){
p = p->next;
}
newNode->next = p->next;
p->next = newNode;
L->length++;
return true;
}
//单链表元素的删除
bool deleEle(NodeLink *L,int index){
Node *p = L->head;
if (L->length == 0)
return false;
if (index < 0 || index>L->length - 1)
return false;
for (int i = 0; i < index - 1;i++){
p = p->next;
}
Node *deNode = p->next;
p->next = deNode->next;
L->length--;
free(deNode);
return true;
}
void main(){
NodeLink linkSqu = {0};
NodeLink linkSqu1 = { 0 };
if (buildNode1(&linkSqu)){
//showLink(&linkSqu);
if (insertEle(&linkSqu,0,3)){
printf(" ");
showLink(&linkSqu);
printf(" ");
}
else{
printf("插入失败");
}
if (deleEle(&linkSqu,0)){
printf(" ");
showLink(&linkSqu);
printf(" ");
}
else{
printf("删除失败");
}
}
else{
printf("建立链表失败");
}
if (buildNode2(&linkSqu1)){
//showLink(&linkSqu1);
}
else{
printf("建立链表失败");
}
}