线性表
定义
#define MAXSIZE 20 //线性表最长长度
typedef int ElemType; //数据类型
typedef struct{
ElemType data[MAXSIZE];
int length;
}SqList;
函数说明
/**
* 顺序表
* InitList(*L) 初始化
* ListEmpty(L) 若为空,返回true
* ClearList(*L) 清空
* GetElem(L,i,*e) 第i个位置元素返回给e
* LocateElem(L,e) 查找与e相同的元素,返回元素在表中序号
* ListInsert(*L,i,e) 第i个元素之前插入元素
* ListDelete(*L,i,*e) 删除L的第i个数据
* * @return
*/
函数部分
int i;
Status InitList(SqList *L){
L->length = 0;
for(i = 0;i < MAXSIZE; i++){
L->data[i] = i;
L->length++;
}
return OK;
}
Status Output(SqList *L){
for(i = 0; i < MAXSIZE; i++){
printf("%d ",L->data[i]);
}
printf("L->length:%d\n",L->length);
return OK;
}
Status GetElem(SqList L,int i,ElemType *e){
*e = L.data[i-1];
return OK;
}
Status LocateElem(SqList L,ElemType e){
for(int i = 0; i < MAXSIZE; i++){
if(L.data[i]==e){
return i;
}
}
return FALSE;
}
Status ListInsert(SqList *L,int i,ElemType e){
int k;
if(L->length == MAXSIZE)
return ERROR;
if(i < 1 || i > L->length+1)
return ERROR;
if(i<=L->length){
for(k = L->length-1;k>=i-1;k--)
L->data[k+1] = L->data[k];
}
L->data[i-1] = e;
L->length++;
return OK;
}
Status ListDelete(SqList *L,int i,ElemType *e){
int k;
if(L->length == 0)
return ERROR;
if(i<1 || i>L->length)
return ERROR;
*e = L->data[i-1];
if(i<L->length){
for(k=i;k<L->length;k++)
L->data[k-1] = L->data[k];
}
L->length--;
return OK;
}
main函数
int main() {
int i = 0;
ElemType e;
//定义L
SqList L;
//初始化L
InitList(&L);
//输出L
Output(&L);
//第i个位置元素返回给e
printf("请输入i的值:");
scanf("%d",&i);
GetElem(L,i,&e);
printf("e的值是:%d\n",e);
//查找与e相同的元素,返回元素在表中序号
printf("请输入e的值:");
scanf("%d",&e);
int j = LocateElem(L,e);
if(j==FALSE){
printf("没有与e相同的元素");
}else{
printf("元素在表中的序号是:%d\n",j);
}
//删除L的第i个数据
printf("请输入要删除第几个数据:");
scanf("%d",&i);
ListDelete(&L,i,&e);
printf("删除后的线性表:");
Output(&L);
//第i个元素之前插入元素
printf("请输入i的值:");
scanf("%d",&i);
printf("请输入要插入输的值");
scanf("%d",&e);
ListInsert(&L,i,e);
printf("插入后的线性表:");
Output(&L);
return 0;
}
单链表
定义
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
函数说明
/**
* 单链表
* InitLinkList(L) 初始化L
* OutputLinkList(L) 输出L
* LinkedListCreateH 头插法
* LinkedListCreateT 尾插法
* Length(L) 长度
* GetElem(L,i,*e) 获取第i个元素值
* ListInsert(L,i,e) 在i个节点之前插入新的数
* ListDelete(L,i,*e) 删除第i个节点
* ClearList(L)
* @return
*/
函数部分
LinkList InitLinkList(){
LinkList L;
L = (LinkList)malloc(sizeof(Node));
if(L==NULL)
printf("空间分配失败");
L->next = NULL;
return L;
}
//头插法
LinkList LinkedListCreateH(LinkList L){
ElemType x;
for(int i=0;i<5;i++){
printf("请输入第%d个数据:",i+1);
scanf("%d",&x);
LinkList p;
p = (LinkList)malloc(sizeof(Node));
p->data = x;
p->next = L->next;
L->next = p;
}
return L;
}
//尾插法
LinkList LinkedListCreateT(LinkList L){
LinkList r;
r = L;
while(r->next){
r = r->next;
}
ElemType x;
for (int i = 0; i < 5; i++) {
printf("请输入第%d个数据:",i+1);
scanf("%d",&x);
LinkList p;
p = (LinkList)malloc(sizeof(Node));
p->data = x;
r->next = p;
r = p;
}
r->next = NULL;
return L;
}
Status OutputLinkList(LinkList L){
LinkList p = L->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
return OK;
}
Status Length(LinkList L){
int length = 0;
LinkList p;
p = L->next;
while(p){
p = p->next;
length++;
}
return length;
}
Status GetElem(LinkList L,int i,ElemType *e){
int j;
LinkList p;
p = L->next;
j = 1;
while (p && j<i){
p = p->next;
++j;
}
if(!p || j>i)
return ERROR;
*e = p->data;
return OK;
}
LinkList ListInsert(LinkList L,int i,ElemType e){
int j;
LinkList p,s;
p = L;
j = 1;
while (p && j<i){
p = p->next;
++j;
}
if(!p || j>i)
return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return L;
}
LinkList ListDelete(LinkList L,int i,ElemType *e){
int j;
LinkList p,q;
p = L; //一开始p是指向头指针的,所以数值为空
j = 1;
while(p->next && j<i){
p = p->next;
++j;
}
if(!(p->next)||j >i)
return ERROR;
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return L;
}
LinkList ClearList(LinkList L){
LinkList p,q;
p = L->next;
while(p){
q = p->next;
free(p);
p = q;
}
L->next = NULL;
}
Status IsClear(LinkList L){
LinkList p;
p = L;
if(p->next==NULL)
return OK;
else
return FALSE;
}
main函数
int main() {
//初始化
LinkList L = InitLinkList();
//头插法
LinkedListCreateH(L);
//输出
OutputLinkList(L);
//尾插法
LinkedListCreateT(L);
//输出
OutputLinkList(L);
//长度
int length = Length(L);
printf("L长度是:%d\n",length);
int i;
ElemType e;
printf("请输入要获取第几个元素的值:");
scanf("%d",&i);
GetElem(L,i,&e);
printf("第%d个元素的值是:%d\n",i,e);
printf("请输入要在第几个数据之前插入:");
scanf("%d",&i);
printf("请输入要插入的值:");
scanf("%d",&e);
ListInsert(L,i,e);
//输出
OutputLinkList(L);
printf("请输入要删除第几个数值:");
scanf("%d",&i);
ListDelete(L,i,&e);
//输出
OutputLinkList(L);
ClearList(L);
printf("线性表是否清除:%d\n",IsClear(L));
return 0;
}