V家镇楼!!!
ps.(我知道程序员中二次元的很少,但还是想要找到和我志同道合的人,
所以我之后的博客中都会有一张图片,不喜欢可以略过)
这次是链式线性表的实现代码,其中涉及到线性表的基本操作和两个线性表的合并。
以下是代码以及代码的使用情况演示。
#include <stdio.h>
#include <malloc.h>
#include <windows.h>
#define ERROR 0
#define OK 1
//类型定义
typedef int Status;
typedef float ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//函数声明:
Status InitList_L(LinkList &L);
Status InsertList_L(LinkList &L,int i,ElemType e);
Status DeleteList(LinkList &L,int i,ElemType &e);
Status GetElem(LinkList L,int i,ElemType &e);
Status GetElem(LinkList L,int i,ElemType &e);
void PrintList(LinkList L);
//创建一个带头结点的空链表
Status InitList_L(LinkList &L){
L->next=NULL;
return OK;
}
//插入
Status InsertList_L(LinkList &L,int i,ElemType e){
LinkList s,p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1){
printf("插入错误,请重新输入!!!\n");
return ERROR;
}
else{
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
}
//删除
Status DeleteList(LinkList &L,int i,ElemType &e){
LinkList q,p=L;
int j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!(p->next)&&j>i-1){
return ERROR;
}
else{
q=p->next;
p->next=q->next;
e=q->data;
free(q);
printf("被删除的元素为:%f\n",e);
return 0;
}
}
//输出
void PrintList(LinkList L){
LinkList p=L->next;
printf("此链表为:");
while(p){
printf("%.2f ",p->data);
p=p->next;
}
printf("\n");
}
//查找并获取
Status GetElem(LinkList L,int i,ElemType &e){
LinkList p;
int j=1;
p=L->next;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i){
return ERROR;
}
else{
e=p->data;
printf("此元素的值为:%.2f\n",e);
return OK;
}
}
//两表相加;
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
Lc=pc=La;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
}
//主函数
int main(void){
LinkList L,La,Lb,Lc,q,p;
int i,n,x;
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
InitList_L(L);
printf(" |$$$线性表的链式存储 | \n");
printf(" |该程序有一下几种功能: | \n");
printf(" |1.创建一个有n个数的链表; | \n");
printf(" |2.删除链表中第i个数,并取出; | \n");
printf(" |3.查找链表中第i个数,并取出; | \n");
printf(" |4.在第i个位置之前插入一个数; | \n");
printf(" |5.创建链表La和Lb,并将二者合并;| \n");
printf(" |0.退出程序! |\n\n\n\n");
printf("请输入要运行的功能:");
scanf("%d",&x);
while(x){
switch(x){
case 1:{
printf("请输入要创建有n个数的链表:\nn=");
scanf("%d",&n);
printf("请输入这%d个值:",n);
q=L;
for(i=1;i<=n;i++){
p=(LinkList)malloc(sizeof(LNode));
scanf("%f",&p->data);
p->next=NULL;
q->next=p;
q=p;
}
PrintList(L);
break;
}
case 2:{
printf("请输入要删除的元素的序号:\n");
scanf("%d",&i);
DeleteList(L,i,e);
PrintList(L);
break;
}
case 3:{
printf("请输入要查找的元素的序号:\n");
scanf("%d",&i);
GetElem(L,i,e);
break;
}
case 4:{
printf("请输入要插入的位置及元素:");
scanf("%d%f",&i,&e);
InsertList_L(L,i,e);
PrintList(L);
break;
}
case 5:{
// 创建第一个链表La;
printf("为递增链表La赋予n个值:");
scanf("%d",&n);
printf("请输入这%d个递增值:",n);
q=La=(LinkList)malloc(sizeof(LNode));
La->next=NULL;
for(i=1;i<=n;i++){
p=(LinkList)malloc(sizeof(LNode));
scanf("%f",&p->data);
p->next=NULL;
q->next=p;
q=p;
}
//创建第二个链表 Lb;
printf("要为链表Lb赋n个递增值:");
scanf("%d",&n);
printf("请输入这%d个递增值:",n);
q=Lb=(LinkList)malloc(sizeof(LNode));
Lb->next=NULL;
for(i=1;i<=n;++i){
p=(LinkList)malloc(sizeof(LNode));
scanf("%f",&p->data);
p->next=NULL;
q->next=p;
q=p;
}
//进行相加;
MergeList_L(La,Lb,Lc);
PrintList(La);
break;
}
}
printf("请输入要执行的程序:");
scanf("%d",&x);
}
printf("程序运行完毕,感谢您的使用!\n");
system("PAUSE");
return 0;
}
我也是个小萌新,只是想要帮助那些和我一样刚学数据结构但是看着书上的伪代码很无力的同学。
大神略过,只不过是想要给新同学一些参考。