前言:
自己动手写了一遍单链表,对指针的运用更加深刻了,其中也有很多小问题,开始一直是闭门造车,调试很多问题,代码写的也很啰嗦,这里其实关键是理解单链表的算法,和顺序表很大不同,对于存储结构,查询方法等。
其次是对于编辑器的痛彻领悟,我一般都是sublime,之后换成了VS studio,发现这大工程太麻烦了,又改成了VScode,之后到了Dev,再到最后sublime+DEV仅仅是为了追求编程的体验。。。。。配置这些IDE学到了很多。
代码:
这次写的代码参考了很多博客,b站,CDSN其中真的感觉代码简洁的舒服,读的很舒服,为了便于理解,代码写了很多繁杂的输出,交互,如果大家觉得没必要直接删主函数里的就可以。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode, *LinkList;
LinkList list_head_insert(LinkList& L) {
LNode* s;
ElemType x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d", &x);
while (x != 2020) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
LinkList list_tail_insert(LinkList& L) {
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode* s, * r = L;
scanf("%d", &x);
while (x != 2020) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
LNode* GetElem(LinkList L, int i) {
int count = 1;
LNode* p = L->next;
if (i == 0)
return L;
if (i < 1)
return NULL;
while (p && count < i) {
count++;
p = p->next;
}
return p;
}
int LocateElem(LinkList L, ElemType e) {
LNode* p = L->next;
int count = 1;
while (p != NULL && p->data != e) {
count++;
p = p->next;
}
return count;
}
bool ListFronInsert(LinkList &L, int i,ElemType e){
LNode* p = GetElem(L,i-1);
if(p==NULL)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data= e;
s->next= p->next;
p->next = s;
return true;
}
bool DeleteLNode(LinkList &L, int i){
LNode* p = GetElem(L,i-1);
if(p==NULL)
return false;
LNode* q;
q = p->next;
p->next = q->next;
free(q);
return true;
}
int Length(LinkList L){
int count=0;
LNode *p=L->next;
while(p){
count++;
p=p->next;
}
return count;
}
bool DestroyList(LinkList &L){
LNode *p=L,*q=L->next;
while(p!=NULL){
free(p);
p=q;
q=p->next;
}
free(p);
}
void PrintList(LinkList L) {
L = L->next;
while (L!=NULL) {
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
int main() {
LinkList L;
int searchI,InsertI,DeleteI;
ElemType searchE,InsertE,DeleteE;
printf("请输入链表数值并以2020结尾:");
//list_head_insert(L);
list_tail_insert(L);
printf("此链表为:");
PrintList(L);
printf("请输入查询数值所在链表的序号:");
scanf("%d", &searchI);
printf("链表第 %d 位的数值是 %d \n", searchI, GetElem(L, searchI)->data);
printf("请输入查询数值:");
scanf("%d", &searchE);
printf("链表值为 %d 的序号是 %d \n", searchE, LocateElem(L, searchE));
printf("请输入插入位置和插入数值:");
scanf("%d%d", &InsertI,&InsertE);
printf("在位置 %d 插入 %d \n",InsertI,InsertE,ListFronInsert(L,InsertI,InsertE));
printf("插入后的链表为:");
PrintList(L);
printf("请输入删除结点的序号: ");
scanf("%d",&DeleteI);
DeleteLNode(L,DeleteI);
printf("删除后的链表为:");
PrintList(L);
printf("链表长度为:%d",Length(L));
DestroyList(L);
printf("链表已自动删除");
return 0;
}