#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include<time.h>
#include<windows.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
status InitList(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return OK;
}
status GetElem(LinkList L,int i,ElemType *e)
{
LNode *p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
LNode *LocateElem(LinkList L,ElemType e)
{
LNode *p=L->next;
while(p&&(p->data!=e))
p=p->next;
return p;
}
status ListInsert(LinkList *L,int i,ElemType e)
{
LNode *p=*L;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||i<1)
return ERROR;
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
status ListDelete(LinkList *L,int i)
{
LNode *p=*L;
int j=0;
while(p->next&&j<i-1)//此处i的前面,但需要检验p->next存在
{
p=p->next;
j++;
}
if(!(p->next)||i<1)
return ERROR;
LNode *q=p->next;
p->next=q->next;
free(q);
return OK;
}
void CreateList_H(LinkList *L,int n)
{
*L=(LNode *)malloc(sizeof(LNode));
LinkList r=*L;
r->next=NULL;
int i;
srand((unsigned)time(NULL));
for(i=0;i<n;i++)
{
LNode *p=(LNode *)malloc(sizeof(LNode));
p->data=rand()%100+1;
p->next=r->next;
r->next=p;
}
}
void CreateList_R(LinkList *L,int n)
{
*L=(LNode *)malloc(sizeof(LNode));
LinkList r=*L;
int i;
srand((unsigned)time(NULL));
for(i=0;i<n;i++)
{
LNode *p=(LNode *)malloc(sizeof(LNode));
p->data=rand()%100+1;
r->next=p;
p->next=NULL;
r=p;
}
}
//双向链表
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
DuLNode *GetElem_DuL(DuLinkList L,int i)
{
DuLNode *p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return NULL;
return p;
}
status ListInsert_DuL(DuLinkList L,int i,ElemType e)
{
DuLNode *p;
if(!(p=GetElem_DuL(L,i)))
return ERROR;
DuLNode *s=(DuLNode *)malloc(sizeof(DuLNode));
s->data=e;
s->next=p;
s->prior=p->prior;
p->prior->next=s;
p->prior=s;
return OK;
}
status ListDelete_DuL(DuLinkList L,int i)
{
DuLNode *p;
if(!(p=GetElem_DuL(L,i)))
return ERROR;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return OK;
}
void printLNode(LinkList L,int num)
{
LNode *s=L->next;
int i;
for(i=0;i<num;i++)
{
printf("%d ",s->data);
s=s->next;
}
printf("\n");
}
int main()
{
LinkList L1,L2;
int num=5;
//虽然LinkList是个指针,但下面还是要传指针的
//地址而非指针的值,否则指针的内容还是不会更改
CreateList_H(&L1,num);
printLNode(L1,num);
CreateList_R(&L2,num);
printLNode(L2,num);
int a;
GetElem(L1,1,&a);
printf("get:\n%d\n",a);
ListInsert(&L1,2,5);
printf("after insert 5 in 2:");
printLNode(L1,num+1);
LNode *p=LocateElem(L1,5);;
printf("locateELem:%d ",p->data);
printf("\n");
ListDelete(&L1,2);
printf("after delete 5 in 2:");
printLNode(L1,num);
//循环链表
DuLinkList L3=(DuLinkList)malloc(sizeof(DuLNode));
DuLNode *q=(DuLNode *)malloc(sizeof(DuLNode));
q->data=1;
q->prior=L3;
q->next=NULL;
L3->next=q;
L3->prior=NULL;
ListInsert_DuL(L3,1,5);
DuLNode *r=L3->next;
printf("DuLNode:\nafter insert 5 in 1: ");
while(r)
{
printf("%d ",r->data);
r=r->next;
}
ListDelete_DuL(L3,1);
r=L3->next;
printf("\nafter insert 5 in 1: ");
while(r)
{
printf("%d ",r->data);
r=r->next;
}
return 0;
}
数据结构C语言-链表
最新推荐文章于 2023-02-24 16:42:33 发布