===========================================
#define MAXSIZE 1000
typedef char ElemType
ElemType data
unsigned short cur
}component, SLinkList[MAXSIZE]
void Init(component *)//初始化静态链表
component* Insert(component *)//插入宏虚李数据到链表
short Malloc(component *)//分配空间
void Free(component *, short)//回收空间
void Disp(component *, component *)//显示静态链表数据
void Purge(component *, component *)//删除重复数据
void Union(component *, component *, component *)//(A-B)交(B-A)
======================================================
s.c
======================================
#i nclude<stdio.h>
#i nclude"definition.h"
void Init(component *L)//初始化静态链表
{ unsigned short i
for(i=0i<MAXSIZE-1i++)
L[i].cur=i+1
L[MAXSIZE-1].cur=0
}
component* Insert(component *L)//插入数据到链表
{ component *T, *temp1, *temp2
unsigned short i
ElemType ch
if( i=Malloc(L) ){
T=temp1=&L[i]
T->cur=0
} else
return 0
while( (ch=getchar()) != '\n' ){
if( i=Malloc(L) ){
temp2=&L[i]
temp2->data=ch
temp2->cur=0
temp1->cur=i
temp1=temp2
} else
return 0
}
return T
}
short Malloc(component *L)//分配空间
{ unsigned short i
i=L[0].cur
if(L[0].cur){
L[0].cur=L[i].cur
return i//成功返回空间位置
}
return 0//失败返回0
}
void Free(component *L, short i) //回收空间
{ L[i].cur=L[0].cur
L[0].cur=i
}
void Disp(component *T, component *L)//显示静态链表数据
{ while(T->cur){
T=&L[T->cur]
printf("%c", T->data)
} printf("\n")
}
void Purge(component *T, component *L) //删除重复数据
{ component *tmp, *temp
for(T=&L[T->cur]T->dataT=&L[T->cur]){//若T->data中没数据,则退出循环
for(temp=T, tmp=&L[T->cur]tmp->data){//若tmp->data中没数据,则退出循环
if(T->data==tmp->data){
temp->cur=tmp->cur
Free(L, (short)(tmp-L))//回收空间
tmp=&L[temp->cur]
} else{
tmp=&L[tmp->cur]
temp=&L[temp->cur]
} }
} }
void Union(component *A, component *B, component *L)//(A-B)交(B-A)
{ component *T, *ta, *tb=B
short flag//用于判断是否进行了删除 *** 作
B=&L[B->cur]
while(B->data){//循环判断,直到B表中所有数据都和A表比较过后才结蔽迟束
ta=T=A
flag=1//1代表没誉弊有进行删除
while(T->cur){//循环判断,直到A表中所有数据都和B->data比较过后才结束
T=&L[T->cur]
if(T->data==B->data){//如果相等,则删除
ta->cur=T->cur
Free(L, (short)(T-L))
T=&L[ta->cur]
tb->cur=B->cur
Free(L, (short)(B-L))
B=&L[tb->cur]
flag=0//1代表进行了删除
break
} else//不相等则把指针移动到一个数据
ta=&L[ta->cur]
} if(flag){//如果没有进行删除 *** 作,则连接两个结点
T->cur=tb->cur
tb->cur=B->cur
B->cur=0
B=&L[tb->cur]
} }
} ======================================================
main.c
=============================
#i nclude<stdio.h>
#i nclude"definition.h"
int main()
{ SLinkList L
component *A, *B
L[0].data=0
Init(L)//初始化静态链表
printf("请为静态链表A输入数据:")
A=Insert(L)//插入数据到链表A
printf("请为静态链表B输入数据:")
B=Insert(L)//插入数据到链表B
printf("静态链表A的数据为:")
Disp(A, L)
printf("静态链表A的数据为:")
Disp(B, L)
Purge(A, L)//删除A中重复元素
printf("删除A中重复元素后得:")
Disp(A, L)
Purge(B, L)//删除B中重复元素
printf("删除B中重复元素后得:")
Disp(B, L)
Union(A, B, L)//(A-B)交(B-A)
printf("(A-B)交(B-A)得:")
Disp(A, L)
return 0
}
c++和c类似//静态链表实现线性表
#include <stdio.h>
#include <alloc.h>
#include <stdlib.h>
#define MaxSize 50
typedef char ElemType
typedef struct StatList
{
ElemType data
int next
} StaticList[MaxSize]
//建立静态巧锋链表
void CreateList(StaticList &L,ElemType a[],int n)
{
int i
L[0].next=1
for(i=1i<=ni++)
{
L[i].data=a[i-1]
L[i].next=i+1
}
L[n].next=0
}
//初始化线性表
void InitList(StaticList &L)
{
int j
L[0].next=0
for(j=1j<MaxSizej++)
L[j].next=-1
}
/瞎缺/判断线性表是否为空表
int ListEmpty(StaticList L)
{
return(L[0].next==0)
}
//求线性表的长度
int ListLength(StaticList L)
{
int i=0,j=0
while(L[j].next!=0)
{
i++
j=L[j].next
}
return(i)
}
//输出线性表
void DispList(StaticList L)
{
int j=0
printf("线性表:")
while(L[j].next!=0)
{
j=L[j].next
printf("%c",L[j].data)
}
printf("\n")
}
//求线性表中某个数据元素值
int GetElem(StaticList L,int i,ElemType &e)
{
int k=0,j=L[0].next
while(k<i-1&&j!=0)
{
k++
j=L[j].next
}
if(j==0) return 0
else
{
e=L[j].data
return 1
}
}
//按元素值查找线性表中第一个与某数相等的元素位置
int LocateElem(StaticList L,ElemType e)
{
int j=L[0].next
int i=1
while(j!=0&&L[j].data!=e)
{
j=L[j].next
i++
}
if(j==0) return 0
else return i
}
//插入数据元素
int ListInsert(StaticList &L,int i,ElemType e)
{
int j=L[0].next,j1,j2,k
if(i==1)
{
if(j==0)
{
L[1].data=e
L[0].next=1L[1].next=0
return 1
}
else
{
k=j+1
while(k!=j)
{
if(L[k].next==-1) break
else k=(k+1)%MaxSize
}
if(k!=j)
{
L[k].data=e
L[k].next=L[0].nextL[0].next=k
return 1
}
else return 0
}
}
else
{
k=0
while(k<i-2&&j!=0)
{
k++
j=L[j].next
}
if(j==0) return 0
else
{
j1=jj2=L[j].next
k=j+1
while(k!=j)
{
if(L[k].next==-1) break
else k=(k+1)%MaxSize
}
if(k!=j)
{
L[k].data=e
L[j1].next=kL[k].next=j2
return 1
}
else return 0
}
}
}
//删孝神晌除数据元素
int ListDelete(StaticList &L,int i,ElemType &e)
{
int j=L[0].next,j1,k
if(L[0].next==0) return 0
if(i==1)
{
j1=L[0].next
L[0].next=L[j1].next
e=L[j1].data
L[j1].next=-1
return 1
}
else
{
k=0
while(k<i-2&&j!=0)
{
k++
j=L[j].next
}
if(j==0) return 0
else
{
if(L[j].next==0) return 0
j1=L[j].next
L[j].next=L[j1].next
e=L[j1].data
L[j1].next=-1
return 1
}
}
}
//主函数
int main()
{
StaticList L
char s[MaxSize],e
int i
printf("请输入线性表元素:")
while(scanf("%s",&s))
{
InitList(L)
CreateList(L,s,strlen(s))
DispList(L)
for(i=1i<=5i++)
ListInsert(L,strlen(s)+i,'a'+i-1)
DispList(L)
printf("线性表的长度:%d\n",ListLength(L))
if(!ListEmpty(L))
printf("线性表非空\n")
else printf("线性表是空的\n")
GetElem(L,3,e)
printf("线性表的第三个元素是:%c\n",e)
printf("元素'a'的位置是:%d\n",LocateElem(L,'a'))
ListInsert(L,4,'f')
DispList(L)
ListDelete(L,3,e)
DispList(L)
printf("\n请输入线性表元素:")
}
system("pause")
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)