数据结构练习—线性表和链表
太菜了,不要看
线性表
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct Lnode *List;
typedef int Position;
struct Lnode{
int Data[MAXSIZE];
int Last;
};
List L;
List MakeEmpty();
Position Find(List L, int x);
bool Insert(List L, int x, Position p);
bool Delete_by_num(List L, int x);
bool Delete_by_pos(List L, Position p);
int Lengh(List L);
void ShowList(List L);
int main(){
L = MakeEmpty();
Insert(L,1,0);
Insert(L,2,0);
Insert(L,3,0);
Insert(L,999,101);
ShowList(L);
Insert(L,4,1);
ShowList(L);
Insert(L,5,3);
ShowList(L);
printf("现在线性表的长度为%d\n",Lengh(L));
printf("寻找5,在Data[%d]处\n",Find(L,5));
Delete_by_num(L,4);
Delete_by_num(L,867);
ShowList(L);
printf("现在线性表的长度为%d\n",Lengh(L));
Delete_by_pos(L,1);
Delete_by_pos(L,999);
ShowList(L);
printf("现在线性表的长度为%d\n",Lengh(L));
return 0;
}
List MakeEmpty()
{
List L;
L=(List)malloc(sizeof(struct Lnode));
L->Last = -1;
return L;
}
bool Insert(List L, int x, Position p)
{
Position i;
if(L->Last == MAXSIZE-1)
{
printf("表满");
return false;
}
if(p<0 || p > L->Last + 1)
{
printf("位置不合法\n");
return false;
}
for(i=L->Last;i>=p;i--)
L->Data[i+1] = L->Data[i];
L->Data[p] = x;
L->Last++;
printf("在Data[%d]插入了%d\n",p,x);
return true;
}
int Lengh(List L)
{
return L->Last+1;
}
void ShowList(List L)
{
for(int i = 0; i<=Lengh(L);i++)
{
printf("Data[%d]-->%d\n",i,L->Data[i]);
}
}
Position Find(List L, int x)
{
Position i=0;
while(i<=L->Last && L->Data[i] != x)
i++;
if(i > L->Last)
{
printf("寻找%d不在表中!\n",x);
return -1;
}
else return i;
}
bool Delete_by_num(List L, int x)
{
Position i = Find(L,x);
if(i==-1) return 0;
for(int j = i; j <= L->Last; j++)
L->Data[j] = L->Data[j+1];
L->Last--;
printf("删除%d,删除了Data[%d]的数据\n",x,i);
return true;
}
bool Delete_by_pos(List L, Position p)
{
Position i;
if(p <0 || p > L->Last)
{
printf("位置%d错误!删除失败\n", p);
return false;
}
for(i=p+1; i<=L->Last; i++)
L->Data[i-1] = L->Data[i];
L->Last --;
printf("删除了Data[%d]的数据\n",p);
return 1;
}
链表
#include<stdio.h>
#include<malloc.h>
typedef struct Lnode *PtrToNode;
struct Lnode
{
int Data;
PtrToNode Next;
};
typedef PtrToNode List;
typedef PtrToNode Position;
List initList();
void display(List L);
void Length(List L);
void Find(List L, int x);
Position Find_re(List L, int x);
bool Insert(List L, int x, Position p);
bool Delete( List L, Position p);
int main()
{
printf("开始准备初始化链表\n");
List L = initList();
display(L);
Length(L);
Find(L,3);
Insert(L,5,Find_re(L,3));
display(L);
Length(L);
Find(L,4);
Insert(L,5,Find_re(L,4));
display(L);
Length(L);
Find(L,4);
Delete(L,Find_re(L,3));
display(L);
Length(L);
Find(L,4);
return 0;
}
List initList()
{
List L = (List)malloc(sizeof(List));
Position temp = L;
for (int i=1; i<5; i++) {
List a=(List)malloc(sizeof(List));
a->Data=i;
a->Next=NULL;
temp->Next=a;
temp=temp->Next;
}
return L;
}
void display(List L)
{
Position temp = L;
int i = 1;
while (temp->Next) {
temp=temp->Next;
printf("第%d个结点:%d\n",i,temp->Data);
i++;
}
}
void Length(List L)
{
Position temp = L;
int t = 0;
while(temp->Next)
{
temp = temp->Next;
t++;
}
printf("链表的长度为%d个节点\n",t);
}
void Find(List L, int x)
{
Position temp = L;
int i=0;
while(temp && temp->Data != x)
{temp = temp->Next;i++;}
if(temp)
{
printf("%d所在的位置是%d\n",x,i);
}else printf("没找到!");
}
Position Find_re(List L, int x)
{
Position temp = L;
int i=0;
while(temp && temp->Data != x)
{temp = temp->Next;i++;}
return temp;
}
bool Insert(List L, int x, Position p)
{
printf("准备插入%d\n",p->Data);
Position pre;
for ( pre=L; pre&&pre->Next!=p; pre=pre->Next ) ;
if ( pre==NULL )
{
printf("插入位置参数错误\n");
return false;
}else{
printf("成功插入%d!\n", p->Data);
Position temp = (List)malloc(sizeof(List));
temp->Data = x;
temp->Next = p;
pre->Next = temp;
return true;
}
}
bool Delete( List L, Position p)
{
printf("准备删除%d\n",p->Data);
Position pre;
for ( pre=L; pre&&pre->Next!=p; pre=pre->Next ) ;
if ( pre==NULL || p==NULL) {
printf("删除位置参数错误\n");
return false;
}
else {
printf("成功删除%d!\n", p->Data);
pre->Next = p->Next;
free(p);
return true;
}
}