【数据结构】——单链表的各功能实现
花了一些时间将单链表实现了一遍,基本涵盖了单链表的所有功能与算法,先上代码,写实验报告的同学可以直接白嫖。
具体功能如下:
这个是带头结点的单链表
#include <cstdio>
#include <cstdlib>
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
if(L == NULL){
return false;
}
L->next = NULL;
return true;
}
bool Empty(LinkList L){
if(L->next == NULL){
return true;
}
return false;
}
bool ListInsert(LinkList &L, int i, int e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListPriorInsert(LinkList &L, int i, int e){
if(i<2){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
bool ListDelete(LinkList &L, int i, int &e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
bool NodeDelete(LinkList &L, int i, int &e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *q = p->next;
e = p->data;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
bool GetElem(LinkList L, int loc, int &data){
if(loc <= 0){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<loc){
p=p->next;
j++;
}
if(p == NULL){
return false;
}
data = p->data;
return true;
}
bool LocateElem(LinkList L, int &loc, int data){
LNode *p = L->next;
int j=1;
while(p!=NULL && p->data!=data){
p=p->next;
j++;
}
if(p == NULL){
return false;
}
loc = j;
return true;
}
int Length(LinkList L){
int j=0;
LNode *p = L;
while(p->next != NULL){
p = p->next;
j++;
}
return j;
}
bool InitList_TailInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
if(L == NULL){
return false;
}
L->next = NULL;
LNode *s,*r = L;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
while(x != 9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
}
r->next = NULL;
return true;
}
bool InitList_HeadInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
if(L == NULL){
return false;
}
L->next = NULL;
LNode *s;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
while(x != 9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
}
return true;
}
void ListShow(LinkList L){
L = L->next;
while(L != NULL){
printf("%d->", L->data);
L = L->next;
}
printf("NULL\n\n");
}
void menu(){
printf("1、创建带头结点空的单链表\n");
printf("2、尾插法创建带头结点的单链表\n");
printf("3、头插法创建带头结点的单链表\n");
printf("4、链表是否为空\n");
printf("5、插入结点\n");
printf("6、指定结点前插入\n");
printf("7、按位序删除\n");
printf("8、指定结点删除\n");
printf("9、按位查找元素\n");
printf("10、按值查找\n");
printf("11、表的长度\n");
printf("12、显示链表\n");
printf("13、退出\n");
}
int main(){
int n;
LinkList L;
while(1){
menu();
printf("请选择:");
scanf("%d", &n);
switch(n){
case 1:{
if(InitList(L)){
printf("创建成功\n\n");
}else{
printf("创建失败\n\n");
};
break;
}
case 2:{
if(InitList_TailInsert(L)){
printf("创建成功\n\n");
}else{
printf("创建失败\n\n");
};
break;
}
case 3:{
if(InitList_HeadInsert(L)){
printf("创建成功\n\n");
}else{
printf("创建失败\n\n");
};
break;
}
case 4:{
if(Empty(L)){
printf("链表为空\n\n");
}else{
printf("链表不为空\n\n");
}
break;
}
case 5:{
printf("请输入需要插入结点的位置:");
int loc;
scanf("%d", &loc);
printf("请输入需要插入结点的数据:");
int data;
scanf("%d", &data);
if(ListInsert(L, loc, data)){
printf("插入成功!\n\n");
}else{
printf("插入失败!\n\n");
}
break;
}
case 6:{
printf("请输入要在哪个位置之前插入:");
int loc;
scanf("%d", &loc);
printf("请输入插入的数据:");
int data;
scanf("%d", &data);
if(ListPriorInsert(L, loc, data)){
printf("插入成功!\n\n");
}else{
printf("插入失败!\n\n");
}
break;
}
case 7:{
printf("请输入要删除哪个位置结点:");
int loc;
int data;
scanf("%d", &loc);
if(ListDelete(L, loc, data)){
printf("删除元素%d成功!\n\n", data);
}else{
printf("删除失败!\n\n");
}
break;
}
case 8:{
printf("请输入要删除哪个位置结点:");
int loc;
int data;
scanf("%d", &loc);
if(NodeDelete(L, loc, data)){
printf("删除元素%d成功!\n\n", data);
}else{
printf("删除失败!\n\n");
}
break;
}
case 9:{
printf("请输入要查找的位置:");
int loc;
int data;
scanf("%d", &loc);
if(GetElem(L, loc, data)){
printf("查找到的元素为%d!\n\n", data);
}else{
printf("查找失败!\n\n");
}
break;
}
case 10:{
printf("请输入要查找的值:");
int loc;
int data;
scanf("%d", &data);
if(LocateElem(L, loc, data)){
printf("查找元素的位置为%d!\n\n", loc);
}else{
printf("查找失败!\n\n");
}
break;
}
case 11:{
printf("表的长度为:%d\n\n", Length(L));
break;
}
case 12:{
ListShow(L);
break;
}
case 13:{
exit(0);
break;
}
}
}
return 0;
}
这个是不带头结点的单链表,由于考研很少会考,所以仅实现了少量功能
#include <cstdio>
#include <cstdlib>
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
bool InitList(LinkList &L){
L = NULL;
return true;
}
bool Empty(LinkList L){
if(L == NULL){
return true;
}
return false;
}
bool ListInsert(LinkList &L, int i, int e){
if(i<1){
return false;
}
if(i==1){
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
return true;
}
LNode *p;
int j=1;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
void ListShow(LinkList L){
while(L != NULL){
printf("%d->", L->data);
L = L->next;
}
printf("NULL\n\n");
}
void menu(){
printf("1、创建不带头结点链表\n");
printf("2、链表是否为空\n");
printf("3、插入结点\n");
printf("4、显示链表\n");
}
int main(){
int n;
LinkList L;
while(1){
menu();
scanf("%d", &n);
switch(n){
case 1:{
if(InitList(L)){
printf("创建成功\n\n");
}else{
printf("创建失败\n\n");
};
break;
}
case 2:{
if(Empty(L)){
printf("链表为空\n\n");
}else{
printf("链表不为空\n\n");
}
break;
}
case 3:{
printf("请输入需要插入结点的位置:");
int loc;
scanf("%d", &loc);
printf("请输入需要插入结点的数据:");
int data;
scanf("%d", &data);
if(ListInsert(L, loc, data)){
printf("插入成功!\n\n");
}else{
printf("插入失败!\n\n");
}
break;
}
case 4:{
ListShow(L);
break;
}
}
}
return 0;
}
下面是各个功能的具体函数实现
创建带头结点空的单链表
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
if(L == NULL){
return false;
}
L->next = NULL;
return true;
}
尾插法创建带头结点的单链表
bool InitList_TailInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
if(L == NULL){
return false;
}
L->next = NULL;
LNode *s,*r = L;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
while(x != 9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
}
r->next = NULL;
return true;
}
头插法创建带头结点的单链表
bool InitList_HeadInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
if(L == NULL){
return false;
}
L->next = NULL;
LNode *s;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
while(x != 9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
printf("请输入结点的值(输入9999结束):");
scanf("%d", &x);
}
return true;
}
链表是否为空
bool Empty(LinkList L){
if(L->next == NULL){
return true;
}
return false;
}
插入结点
bool ListInsert(LinkList &L, int i, int e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
指定结点前插入
bool ListPriorInsert(LinkList &L, int i, int e){
if(i<2){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *s = (LNode *)malloc(sizeof(LNode));
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
按位序删除
bool ListDelete(LinkList &L, int i, int &e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
指定结点删除
bool NodeDelete(LinkList &L, int i, int &e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *q = p->next;
e = p->data;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
按位查找元素
bool GetElem(LinkList L, int loc, int &data){
if(loc <= 0){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<loc){
p=p->next;
j++;
}
if(p == NULL){
return false;
}
data = p->data;
return true;
}
按值查找
bool LocateElem(LinkList L, int &loc, int data){
LNode *p = L->next;
int j=1;
while(p!=NULL && p->data!=data){
p=p->next;
j++;
}
if(p == NULL){
return false;
}
loc = j;
return true;
}
表的长度
int Length(LinkList L){
int j=0;
LNode *p = L;
while(p->next != NULL){
p = p->next;
j++;
}
return j;
}
显示链表
void ListShow(LinkList L){
L = L->next;
while(L != NULL){
printf("%d->", L->data);
L = L->next;
}
printf("NULL\n\n");
}