1、静态链表的操作
//静态链表
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000
#define OK 1
#define ERROR -1
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType data;
int cur;
}Component,StaticLinkList[MAXSIZE];
Status InitList(StaticLinkList space){
//space[0].cur;//t头指针
int i=0;
for(int i=0;i<MAXSIZE=1;i++)
space[i].cur=i+1;
space[MAXSIZE-1].cur=0;
return OK;
}
//备用链表
int Malloc_SLL(StaticLinkList space){
int i=space[0].cur;
if(space[0].cur)
space[0].cur=space[i].cur;
return i;
}
Status ListLength(StaticLinkList L){
int i=L[MAXSIZE-1].cur;
while(i){
i=L[i].cur;
j++;
}
return j;
}
Status ListInsert(StaticLinkList L,int i,ElemType e){
int j,k,l;
if(i<1||i>ListLength(L)+1)
return ERROR;
j=Malloc_SLL(L);//获取备用链表的第一个下标
if(j){
L[j].data=e;
for(l=1;l<=i-1;l++)//找到i前面的元素下标k
k=L[k].cur;
L[j].cur=L[k].cur;//继承k的下标
L[k].cur=j;
return OK;
}
return ERROR;
}
void Free_SSL(StaticLinkList space,int k){
space[k].cur=space[0].cur;
space[0].cur=k;
}
Status ListDelete(StaticLinkList L,int i){
int j,k,l;
if(i<1||i>ListLength(L)+1)
return ERROR;
k=MAXSIZE-1;
j=L[k].cur;//要删除的下标
L[k].cur=L[j].cur;
Free_SSL(L,j);
return OK;
}
2、双向链表的操作
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
typedef int ElemType;
typedef int Status;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
void InitList(DuLinkList *L);
void CreateList(DuLinkList *L);
int GetElem(DuLinkList L,int i);
int LocateElem(DuLinkList L,ElemType key);
void DulLinkInsert(DuLinkList L,int i,ElemType e);
void DeleteDuList(DuLinkList L,int i);
void Display(DuLinkList L);
int main(){
DuLinkList La;int i;ElemType e;
InitList(&La);
CreateList(&La);
Display(La);
printf("请输入要查询的序号:");
scanf("%d",&i);
printf("该序号所对应的数值为:%d\n",GetElem(La,i));
printf("请输入要查询的元素值:");
scanf("%d",&e);
printf("该值所对应的序号为:%d\n",LocateElem(La,e));
printf("请输入要插入的序号和元素值:");
scanf("%d %d",&i,&e);
DulLinkInsert(La,i,e);
printf("新序列为:");
Display(La);
printf("\n请输入要删除的元素序号:");
scanf("%d",&i);
DeleteDuList(La,i);
printf("新序列为:");
Display(La);
return 0;
}
void InitList(DuLinkList *L){
*L=(DuLinkList)malloc(sizeof(DuLNode));
if(*L==NULL)
exit(-1);
(*L)->next=NULL;
(*L)->prior=NULL;
}
//创建
void CreateList(DuLinkList *L){
DuLinkList p,s;
int n;
printf("Please enter the length of the list:");
scanf("%d",&n);
(*L)=(DuLinkList)malloc(sizeof(DuLNode));
p=*L;
printf("Please enter the list:");
for(int i=0;i<n;i++){
s=(DuLinkList)malloc(sizeof(DuLNode));
scanf("%d",&s->data);
p->next=s;
s->prior=p;
p=s;
}
p->next=NULL;
}
//按序号查找
int GetElem(DuLinkList L,int i){
int j=1;
DuLinkList p=L->next;
if(i<1)
exit(-1);
while(p&&j<i){
p=p->next;
j++;
}
return p->data;
}
int LocateElem(DuLinkList L,ElemType key){
int i=1;
DuLinkList p=L->next;
if(p==NULL)
exit(-1);
while(p&&p->data!=key){
p=p->next;i++;
}
return i;
}
//指定位置插入
void DulLinkInsert(DuLinkList L,int i,ElemType e){
DuLinkList p,s;
int j=0;
p=L;
while(p&&j<i-1){
p=p->next;j++;
}
s=(DuLinkList)malloc(sizeof(DuLNode));
s->data=e;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
p->next=s;
s->prior=p;
}
//指定位置删除
void DeleteDuList(DuLinkList L,int i){
DuLinkList p=L->next,q;i--;
int j=1;
while(i<1||!p->next)
exit(-1);
while(p&&j<i){
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
}
void Display(DuLinkList L){
DuLinkList p=L->next;
int i=0;
while(p){
printf("%d ",p->data);
p=p->next;
i++;
}
printf("\n");
if(i==0)
printf("NULL!");
}
3、双向链表的合并
//双向链表
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
typedef int ElemType;
typedef int Status;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
void InitList(DuLinkList *L);
void CreateList(DuLinkList *L);
int GetElem(DuLinkList L,int i);
int LocateElem(DuLinkList L,ElemType key);
void DulLinkInsert(DuLinkList L,int i,ElemType e);
void DeleteDuList(DuLinkList L,int i);
void Display(DuLinkList L);
DuLinkList Merge(DuLinkList La,DuLinkList Lb);
int main(){
DuLinkList La,Lb,Lc;
InitList(&La);InitList(&Lb);InitList(&Lc);
CreateList(&La);CreateList(&Lb);
Display(La);Display(Lb);
printf("合并后的新序列为:");
Lc=Merge(La,Lb);
Display(Lc);
return 0;
}
void InitList(DuLinkList *L){
*L=(DuLinkList)malloc(sizeof(DuLNode));
if(*L==NULL)
exit(-1);
(*L)->next=NULL;
(*L)->prior=NULL;
}
//创建
void CreateList(DuLinkList *L){
DuLinkList p,s;
int n;
printf("Please enter the length of the list:");
scanf("%d",&n);
(*L)=(DuLinkList)malloc(sizeof(DuLNode));
p=*L;
printf("Please enter the list:");
for(int i=0;i<n;i++){
s=(DuLinkList)malloc(sizeof(DuLNode));
scanf("%d",&s->data);
p->next=s;
s->prior=p;
p=s;
}
p->next=NULL;
}
void Display(DuLinkList L){
DuLinkList p=L->next;
int i=0;
while(p){
printf("%d ",p->data);
p=p->next;
i++;
}
printf("\n");
if(i==0)
printf("NULL!");
}
DuLinkList Merge(DuLinkList La,DuLinkList Lb){
DuLinkList pa,pb,pc,Lc;
Lc=(DuLinkList)malloc(sizeof(DuLNode));
pa=La->next;pb=Lb->next;pc=Lc;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;pa->prior=pc;pa=pa->next; pc=pc->next;
}
else{
pc->next=pb;pb->prior=pc;pb=pb->next; pc=pc->next;
}
}
while(pa!=NULL){
pc->next=pa;pa->prior=pc;pa=pa->next; pc=pc->next;
}
while(pb!=NULL){
pc->next=pb;pb->prior=pc;pb=pb->next; pc=pc->next;
}
free(La);
free(Lb);
return Lc;
}