数据结构单链表回顾
个人学习回顾 不喜勿喷~!
结构体声明
typedef struct LNode
{
int data;
LNode* next;
} LNode, * LinkList;
单链表操作
- 尾插法创建单链表
- 头插法创建单链表
- 按位插入元素
- 按位删除元素
- 获取某一位置元素
- 返回单链表长度
- 单链表显示
全部代码展示
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
LNode* next;
} LNode, * LinkList;
//本文中全部单链表操作都是基于带头结点来操作;
LinkList list_tailInsert(LinkList &L);//尾插法
LinkList list_headerInsert(LinkList &L);//头插法
bool list_location_insert(LinkList& L, int i, int e);//按位插入
bool list_location_delete(LinkList& L, int i);//按位删除
LNode* list_getItem(LinkList L, int i);//获取某一位置元素
int list_checkLength(LinkList L);//返回单链表长度
void list_Display(LinkList L);//单链表展示
int main()
{
LinkList L;
list_tailInsert(L); //尾插法创建单链表
//list_headerInsert(L);
list_Display(L);
int flag = 1;//是否继续插入
while(flag)
{
int i; int e;
printf("请输入插入位置以及数值(空格隔开)\n");
scanf_s("%d %d", &i, &e);
list_location_insert(L, i, e) ? printf("插入成功!\n") : printf("插入失败!\n");
list_Display(L);
printf("是否继续插入?1为继续 0为不继续\n");
scanf_s("%d", &flag);
while(flag!=1&&flag!=0)
{
printf("你输入的不合法,请重新输入");
scanf_s("%d", &flag);
}
}
//list_getItem(L, 2);
printf("单链表的长度%d\n",list_checkLength(L));
/*按位置删除*/
//int f;
//printf("请输入删除的位置\n");
//scanf_s("%d", &f);
//list_location_delete(L,f);
//list_Display(L);
system("pause");
return 0;
}
void list_Display(LinkList L)
{
LNode *p;
p = L;
if(p->next==NULL||p==NULL)
{
printf("您的单链表为空\n");
}
int j = 0;
while(p->next!=NULL)
{
p = p->next;
j++;
printf("第%d个数值为%d\n",j,p->data);
}
}
//尾插法
LinkList list_tailInsert(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *p;
p = L;
int x;
printf("请输入插入数值");
scanf_s("%d", &x);
while (x != 99999)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
p->next = s;
p = s;
printf("请输入插入数值");
scanf_s("%d", &x);
}
p->next = NULL;
return L;
}
//头插法
LinkList list_headerInsert(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
LNode* p, * s;
p = L;
p->next = NULL;
int x;
printf("请输入插入数值");
scanf_s("%d", &x);
while(x!=99999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
printf("请输入插入数值");
scanf_s("%d", &x);
}
return L;
}
//按位插入
bool list_location_insert(LinkList &L,int i,int e)
{
if(i<1){
printf("插入位置不合法\n");
return false;
}
int j = 0;
LNode *p,*s;
p = L;
while (p!= NULL && j < i - 1)
{
p = p->next;
j++;
}
if(p==NULL) return false;
s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//返回元素
LNode* list_getItem(LinkList L,int i)
{
LNode* p;
p = L;
if(i<1)
{
printf("输入位置不合法!\n");
return NULL;
}
int j = 0;
while (j < i&&p!=NULL)
{
p = p->next;
j++;
}
if(p==NULL)
{
return NULL;
}
printf("第%d位置上的数值为%d",i,p->data);
return p;
}
//返回单链表长度
int list_checkLength(LinkList L)
{
LNode* p = L;
if(p->next==NULL)
{
return 0;
}
int num = 0;
while(p->next!=NULL)
{
p = p->next;
num++;
}
return num;
}
//按位删除
bool list_location_delete(LinkList &L,int i)
{
if(i<1||i>list_checkLength(L))
{
printf("您输入的位置不合法\n");
return false;
}
LNode* p = L;
int j = 0;
while(p!=NULL&&j<i-1)
{
p = p->next;
j++;
}
if(p == NULL)
{
return false;
}
p->next = p->next->next;
return true;
}