前言:
本篇博客适合那些已经接触过数据结构并了解过链表的知识。对于那些还没入门的小伙伴来说,这篇博客不适合阅读。我们在学习这节知识时,书上给出的代码都是一片段的,没有最终给出完整可以运行的代码,本篇博客就特意写出了完整代码,希望大家能够在阅读本篇博客后,收获很多,当然,如果有写的不好的地方,希望大家给出意见或批评。
顺序表完整代码
//顺序表完整代码
#include<time.h>
#include<windows.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct ListNode{
ElemType data[MAXSIZE];
int length;
}*LNode;
//初始化操作
Status InitLNode(){
LNode L;
L=(LNode)malloc(sizeof(struct ListNode));
L->length=0;
return L;
}
//返回长度
Status Len_LNode(LNode L){
printf("顺序表的长度为:%d\n",L->length);
return OK;
}
//输入操作
void Input_LNode(LNode L){
printf("请输入元素的总个数:");
int n;
scanf("%d",&n);
printf("请输入各个元素:\n");
for(int i=0;i<n;i++){
scanf("%d",&L->data[i]);
}
L->length=n;
printf("录入成功\n");
}
//输出操作
void Output_LNode(LNode L){
for(int i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
printf("\n");
printf("输出完毕\n");
}
//获取指定元素操作
Status GetElem(LNode L,int i,ElemType *e){
if(i<1||i>L->length||L->length==0){
printf("获取元素失败\n");
return ERROR;
}
*e=L->data[i-1];
printf("获取的元素为:%d\n",*e);
return OK;
}
//插入操作
Status Insert_LNode(LNode L,int i,ElemType e){
if(L->length==MAXSIZE||i<1||i>L->length){
printf("插入失败\n");
return ERROR;
}
int k;
for(k=L->length-1;k>=i-1;k--){
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;
L->length++;
printf("插入成功\n");
return OK;
}
//删除操作
Status Delete_LNode(LNode L,int i,ElemType *e){
if(L->length==0||i<1||i>L->length){
printf("删除失败\n");
return ERROR;
}
int k;
*e=L->data[i-1];
for(k=i-1;k<L->length-1;k++){
L->data[k]=L->data[k+1];
}
L->length--;
printf("删除成功\n");
return OK;
}
//销毁顺序表
void Destroy_LNode(LNode L){
L->length=0;
printf("销毁成功\n");
}
int main(){
LNode L;
L=InitLNode();
int choice=0;
while(choice!=8){
printf("**********菜单**********\n");
printf("|1.输入元素 2.输出顺序表的元素|\n");
printf("|3.插入操作 4.删除操作|\n");
printf("|5.获取元素操作 6.销毁顺序表|\n");
printf("|7.返回顺序表长度 8.退出程序|\n");
printf("请输入你的选择:");
scanf("%d",&choice);
switch(choice){
case 1 :
Input_LNode(L);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
case 2 :
Output_LNode(L);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
case 3 :
{
int i;
int e;
printf("请输入你要在第几个元素前面插入一个元素:");
scanf("%d",&i);
printf("请输入插入的元素值:");
scanf("%d",&e);
Insert_LNode(L,i,e);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 4 :
{
int i;
ElemType e;
printf("请输入你要删除第几个元素:");
scanf("%d",&i);
Delete_LNode(L,i,&e);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
}
case 5 :
{
int i;
ElemType e;
printf("请输入你要获取第几个元素:");
scanf("%d",&i);
GetElem(L,i,&e);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 6 :
Destroy_LNode(L);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
case 7 :
Len_LNode(L);
break;
case 8 :
system("cls");
printf("程序退出\n");
break;
}
}
return 0;
}
单链表完整代码
//单链表完整代码
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct Node{
ElemType *data;
struct Node *next;
}Node;
typedef struct Node* LinkList;
//获取元素操作
Status GetElem(LinkList *L,int i,ElemType *e){
int j=1;
LinkList p;
p=(*L)->next;
while(j<i&&p){
p=p->next;
j++;
}
if(!p||j>i){
printf("指定元素不存在\n");
return ERROR;
}
*e=p->data;
printf("获取成功!\n元素值为:%d\n",*e);
return OK;
}
//插入操作
Status InsertList(LinkList *L,int i,ElemType e){
int j;
j=1;
LinkList p,s;
p=*L;
while(p&&j<i){
p=p->next;
j++;
}
if(j>i||!p){
printf("输入有误,插入失败!\n");
return ERROR;
}
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
printf("插入成功!\n");
return OK;
}
//删除操作
Status DeleteList(LinkList *L,int i,ElemType *e){
int j;
j=1;
LinkList p,s;
p=*L;
while(j<i&&p){
p=p->next;
j++;
}
if(j>i||!p){
printf("输入有误,删除失败!");
return ERROR;
}
s=p->next;
*e=s->data;
p->next=s->next;
free(s);
printf("删除成功!\n");
return OK;
}
//头插法
void CreateListHead(LinkList *L,int n){
LinkList p;
int i;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
for(i=0;i<n;i++){
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
}
printf("程序录入成功!\n");
}
//尾插法
void CreateListTail(LinkList *L,int n){
LinkList p,r;
int i;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++){
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;
printf("程序录入成功!\n");
}
//输出操作
void Output_List(LinkList *L){
LinkList p;
p=(*L)->next;
if(!p){
printf("表中无任何元素!\n");
}
else{
while(p){
printf("%d ",p->data);
p=p->next;
}
}
printf("\n输出完毕!\n");
}
//输入操作(头插法)
void Input_ListHead(LinkList *L){
int n;
LinkList p;
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
printf("请输入元素的总个数:");
scanf("%d",&n);
printf("请输入各个元素的值:\n");
for(int i=0;i<n;i++){
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
p->next=(*L)->next;
(*L)->next=p;
}
printf("程序录入成功!\n");
}
//输入操作(尾插法)
void Input_ListTail(LinkList *L){
int n;
LinkList p,r;
*L=(LinkList)malloc(sizeof(Node));
r=*L;
printf("请输入元素的总个数:");
scanf("%d",&n);
printf("请输入各个元素的值:\n");
for(int i=0;i<n;i++){
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
r->next=p;
r=p;
}
r->next=NULL;
printf("程序录入成功!\n");
}
//初始化操作
LinkList Init_List(){
LinkList L;
L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
return L;
}
int main(){
LinkList L;
L=Init_List();
int choice=0;
while(choice!=9){
printf("**********菜单**********\n");
printf("|1.头插法录入数据 2.尾插法录入数据|\n");
printf("|3.删除元素 4.插入元素|\n");
printf("|5.键盘输入元素(头插法) 6.输出元素|\n");
printf("|7.获取指定元素 8.键盘输入元素(尾插法)|\n");
printf("|9.退出程序|\n");
printf("请输入你的选择:");
scanf("%d",&choice);
switch(choice){
case 1: {
int n;
printf("请输入元素的总个数:");
scanf("%d",&n);
CreateListHead(&L,n);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
case 2:{
int n;
printf("请输入元素的总个数:");
scanf("%d",&n);
CreateListTail(&L,n);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
case 3:{
ElemType e;
int i;
printf("请输入你要删除第几个元素:");
scanf("%d",&i);
DeleteList(&L,i,&e);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
case 4:{
ElemType e;
int i;
printf("请输入你要在第几元素前插入元素:");
scanf("%d",&i);
printf("请输入你要插入元素的值:");
scanf("%d",&e);
InsertList(&L,i,e);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
case 5:{
Input_ListHead(&L);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
case 6:{
Output_List(&L);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
case 7:{
int i;
ElemType e;
printf("请输入你想获取第几个元素:");
scanf("%d",&i);
GetElem(&L,i,&e);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
case 8:{
Input_ListTail(&L);
printf("程序将自动跳转到菜单页面\n");
Sleep(1000);
system("cls");
break;
}
}
}
return 0;
}
静态链表完整代码
//静态链表代码
#include<time.h>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 200
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType data;
int cur;
}Component,StaticLinkList[MAXSIZE];
//初始化操作
void InitList(StaticLinkList space){
for(int i=0;i<MAXSIZE-1;i++){
space[i].cur=i+1;
}
space[MAXSIZE-1].cur=0;
}
//获取空闲分量
int Malloc_SLL(StaticLinkList space){
int i=space[0].cur;
if(space[0].cur){
space[0].cur=space[i].cur;
}
return i;
}
//插入操作
Status ListInsert(StaticLinkList L,int i,ElemType e){
int j,k,l;
k=MAXSIZE-1;
if(i<1||i>ListLength(L)+1){
return ERROR;
printf("插入失败\n");
}
j=Malloc_SLL(L);
if(j){
for(l=1;l<=i-1;l++){
k=L[k].cur;
}
L[j].data=e;
L[j].cur=L[k].cur;
L[k].cur=j;
}
printf("插入成功\n");
return OK;
}
//删除操作
Status ListDelete(StaticLinkList L,int i){
int j,k;
if(i<1||i>ListLength(L)){
return ERROR;
printf("删除失败\n");
}
k=MAXSIZE-1;
for(j=1;j<=i-1;j++){
k=L[k].cur;
}
j=L[k].cur;
L[k].cur=L[j].cur;
Free_SLL(L,j);
printf("删除成功\n");
return OK;
}
//将待删除元素放置于备用处
void Free_SLL(StaticLinkList space ,int k){
space[k].cur=space[0].cur;
space[0].cur=k;
}
//获取表长
int ListLength(StaticLinkList L){
int j=0;
int i=L[MAXSIZE-1].cur;
while(i){
i=L[i].cur;
++j;
}
return j;
}
//输入操作
void Input_List(StaticLinkList L){
printf("请输入元素的总个数:");
int n;
scanf("%d",&n);
printf("请输入各个元素值:\n");
for(int i=1;i<=n;i++){
scanf("%d",&L[i].data);
}
L[0].cur=n+1;
L[n].cur=0;
L[MAXSIZE-1].cur=1;
printf("程序录入完毕!\n");
}
//输出操作
void Output_List(StaticLinkList L){
int i=L[MAXSIZE-1].cur;
while(i){
printf("%d ",L[i].data);
i=L[i].cur;
}
printf("\n");
printf("程序输出完毕!\n");
}
int main(){
StaticLinkList L;
InitList(L);
int choice=0;
while(choice!=7){
printf("**********菜单**********\n");
printf("|1.输入元素 2.输出元素|\n");
printf("|3.删除操作 4.插入操作|\n");
printf("|5.返回表长度 6.初始化链表|\n");
printf("|7.退出程序|\n");
printf("请输入你的选择:");
scanf("%d",&choice);
switch(choice){
case 1 :
{
Input_List(L);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 2 :
{
Output_List(L);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 3 :
{
int i;
printf("请输入你想删除第几个元素:");
scanf("%d",&i);
ListDelete(L,i);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 4 :
{
printf("请输入你想在第几个元素前插入一个元素:");
int i;
scanf("%d",&i);
printf("所插入的元素值为:");
ElemType e;
scanf("%d",&e);
ListInsert(L,i,e);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 5 :
{
int length=ListLength(L);
printf("表的长度为:%d\n",length);
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 6 :
{
InitList(L);
printf("初始化成功\n");
printf("程序将自动跳转到菜单栏\n");
Sleep(1000);
system("cls");
break;
}
case 7 :
{
system("cls");
printf("程序退出\n");
}
}
}
return 0;
}
参考文献:
<<大话数据结构>>