线性表及其基本操作
一、顺序表示
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
typedef struct{
int *data;
int Maxsize;
int length;
}SeqList;
void InitList(SeqList &L){
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=0;
L.Maxsize=InitSize;
}
void IncreaseSize(SeqList &L,int len){
int *p=L.data;
L.data=(int*)malloc((L.Maxsize+len)*sizeof(int));
for(int i=0;i<L.length;i++){
L.data[i]=p[i];
}
L.Maxsize=L.Maxsize+len;
free(p);
}
bool ListInsert(SeqList &L,int i,int e){
if(i<1||i>L.length+1)
return false;
if(L.length>=L.Maxsize){
IncreaseSize(L,1);
ListInsert(L,i,e);
}
for(int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return true;
}
bool ListDelete(SeqList &L,int i,int &e){
if(i<1||i>L.length)
return false;
e=L.data[i-1];
for(int j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
int LocateElem(SeqList L,int e){
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
int GetElem(SeqList L,int i){
return L.data[i-1];
}
int main(){
int temp;
int Locate;
SeqList L;
InitList(L);
IncreaseSize(L,5);
for(int i=1;i<8;i++)
ListInsert(L,i,i);
for(int i=0;i<7;i++)
printf("%d\n",L.data[i]);
printf("此时顺序表长度为%d\n",L.length);
ListDelete(L,4,temp);
printf("删除了第4个元素,其值为%d\n",temp);
printf("此时顺序表长度为%d\n",L.length);
Locate=LocateElem(L,6);
printf("值为6的元素在顺序表中的位置为%d\n",Locate);
return 0;
}
二、链式表示
1、单链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
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){
return(L->next==NULL);
}
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
bool InsertPriorNode(LNode *p,int e){
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return true;
}
bool InsertNextNode(LNode *p,int e){
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
LNode *GetElem(LinkList L,int i){
if(i<0)
return false;
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
int LocateElem(LinkList L,int e){
LNode *p=L->next;
int pos=1;
while(p!=NULL&&p->data!=e){
p=p->next;
pos++;
}
return pos;
}
bool ListInsert(LinkList &L,int i,int e){
if(i<1)
return false;
LNode *p;
p=GetElem(L,i-1);
return InsertNextNode(p,e);
}
bool ListDelete(LinkList &L,int i,int &e){
if(i<1)
return false;
LNode *p;
p=GetElem(L,i-1);
if(p==NULL)
return false;
if(p->next==NULL)
return false;
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
bool DeleteNode(LNode *p){
if(p==NULL)
return false;
LNode *q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);
return true;
}
int GetLength(LinkList L){
LNode *p;
int sum=0;
p=L;
while(p->next!=NULL){
sum++;
p=p->next;
}
free(p);
return sum;
}
void PrintList(LinkList L){
LNode* p=L;
while(p->next!=NULL){
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
int main(){
LinkList L;
LNode *s;
int x,y,num;
printf("创建链表,输入9999结束\n");
List_HeadInsert(L);
PrintList(L);
printf("在第2个结点(不含头结点)的前面添加携带值为10的结点\n");
InsertPriorNode(L->next->next,10);
PrintList(L);
printf("在第1个结点(不含头结点)的后面添加携带值为11的结点\n");
InsertNextNode(L->next,11);
PrintList(L);
s=GetElem(L,3);
printf("链表中第3个元素(不含头结点)的值为:%d\n",s->data);
x=LocateElem(L,5);
printf("链表中值为5的元素所在位置为:%d\n",x);
printf("在链表第3个结点处插入17\n");
ListInsert(L,3,17);
PrintList(L);
printf("删除链表中第5个结点\n");
ListDelete(L,5,y);
printf("被删除后的链表中元素为:");
PrintList(L);
printf("被删除结点的元素值为:%d\n",y);
num=GetLength(L);
printf("当前链表长度为:%d\n",num);
return 0;
}
2、双链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*DLinkList;
DLinkList List_HeadInsert(DLinkList &L){
DNode *s;
int x;
L=(DLinkList)malloc(sizeof(DNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(DNode*)malloc(sizeof(DNode));
s->data=x;
s->next=L->next;
s->prior=L;
L->next=s;
scanf("%d",&x);
}
return L;
}
DNode *GetElem(DLinkList L,int i){
if(i<1)
return false;
DNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
bool InsertNextNode(DNode *p,DNode *s){
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
}
int DeleteNextNode(DNode *p){
int e;
if(p==NULL) return -1;
DNode *q=p->next;
if(q==NULL) return -1;
e=p->next->data;
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return e;
}
void DestroyList(DLinkList &L){
while(L->next!=NULL)
DeleteNextNode(L);
free(L);
L=NULL;
}
void PrintList(DLinkList L){
DNode* p=L;
while(p->next!=NULL){
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
int main(){
DLinkList L;
DNode *s,*p;
int x;
printf("创建双链表,输入9999结束\n");
List_HeadInsert(L);
PrintList(L);
s=GetElem(L,3);
printf("双链表第3个结点的值为:%d\n",s->data);
p=(DNode*)malloc(sizeof(DNode));
p->data=10;
p->prior=p->next=NULL;
InsertNextNode(s,p);
printf("在双链表第3个结点后插入值为10的元素后的双链表如下:\n");
PrintList(L);
x = DeleteNextNode(s);
printf("删除双链表第3个结点后继结点后的双链表如下:\n");
PrintList(L);
printf("被删除结点的值为:%d\n",x);
return 0;
}
3、循环链表
3-1、循环单链表
在这里插入代码片
3-2、循环双链表
在这里插入代码片
4、静态链表
#define MaxSize 50
typedef struct{
ElemType data;
int next;
}SLinkList[MaxSize];