/***********线性表的链式存储--单链表结构************/
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node, *LinkList;
/*************Operation**********/
void CreateListHead(LinkList L,int n) //随机产生n个元素的值,建立带表头结点的单链表(表头插入法)
{
int i;
LinkList p;
srand(time(0));
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=L->next;
L->next=p;
}
}
void CreateListTail(LinkList L,int n) //随机产生n个元素的值,建立带表头结点的单链表(表尾插入法)
{
int i;
LinkList p,r;
srand(time(0));
r=L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;
}
Status GetElem(LinkList L,int i,ElemType *e) //将链表L的第i个位置的元素值返回给e,成功则返回TRUE,反之则返回FALSE
{
int j=1;
LinkList p;
p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
Status ListInsert(LinkList *L,int i,ElemType e) //在L中第i个元素之前插入新的元素e,插入成功返回OK,反之返回ERROR
{
LinkList p,s;
int j=1;
p=*L;
while(p->next&&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 OK;
}
Status ListDelete(LinkList *L,int i,ElemType *e) //在L中删除第i个元素的值,其值返回给e,删除成功返回OK,反之返回ERROR
{
LinkList p,q;
int j=1;
p=*L;
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 OK;
}
Status ClearList(LinkList *L) //将链表L置为空链表
{
LinkList p,q;
p=*L;
while(p->next)
{
q=p->next;
p->next=q->next;
free(q);
}
(*L)->next=NULL;
return ERROR;
}
void PrintList(LinkList List) //打印链表
{
Node* p;
p=List->next;
if(!List->next)
printf("链表为空");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
main(void)
{
LinkList list,*l;
int i=1;
ElemType *e;
e=(ElemType*)malloc(sizeof(ElemType*));
l=&list;
list=(LinkList)malloc(sizeof(Node));
list->next=NULL;
printf("建立一个单链表\n");
CreateListTail(list,5);
PrintList(list);
ListInsert(l,5,15);
PrintList(list);
GetElem(list,3,e);
printf("%d\n",*e);
i=ListDelete(l,3,e);
printf("%d\n",i);
PrintList(list);
printf("%d\n",*e);
ClearList(l);
PrintList(list);
}
数据结构之单链表实现
最新推荐文章于 2022-08-23 17:49:44 发布