线性表(下)之链式存储之双向,单向循环列表

线性表之链式存储(双向循环链表)
//注意:该文件操作的链表为带头结点双向链表,头结点数据为-1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define ERROR 0

typedef int data_t;
typedef struct DulNode
{
data_t data;
struct DulNode *prior;
struct DulNode *next;
}DulNode,*DuLinkList;

int GetElem(DuLinkList L,int i,data_t *data)//读取双向链表的第i个元素
{
int j;
DuLinkList p;
p = L;
j = 1;
while(p && j<i)
{
p = p->next;//让p指向下一个节点
j++;
}
if(!p)
{
printf("第%d个位置不存在!\n",i);
return ERROR;
}
*data = p->data;
return OK;
}

int ListInsert(DuLinkList L,int i,data_t e)
{
int j;
DuLinkList p,s;
p=L;
j=1;
while(p && j<i)
{
p=p->next;
j++;
}
if(!p)
{
printf("第%d个位置不存在!\n",i);
return ERROR;
}
s=(DuLinkList)malloc(sizeof(DulNode));
s->data=e;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
return OK;
}

int ListDelete(DuLinkList L,int i,data_t *e)
{
int j;
DuLinkList p;
p=L;
j=1;
while(p->next && j<=i)
{
p=p->next;
j++;
}
if(!(p->next))
{
printf("第%d个位置不存在!\n",i);
return ERROR;
}
*e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
p=NULL;
return OK;
}

DuLinkList CreateEmptyList()
{
DuLinkList p;
p = (DuLinkList)malloc(sizeof(DulNode));
if(p==NULL)
{
perror("CreateEmptyList error");
exit(0);
}
p->prior=NULL;
p->next=NULL;
p->data=-1;
return p;
}

DuLinkList CreateList(DuLinkList L,int n)
{
DuLinkList p,r;
int i;
srand(time(NULL));
r = L;
for(i=0;i<n;i++)
{
p = (DuLinkList)malloc(sizeof(DulNode));
p->data = rand()%100+1;
r->next = p;
p->prior = r;
r = p;
}
r->next = NULL;
return L;
}

int ClearList(DuLinkList L)
{
DuLinkList p,q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return OK;
}

int PrintList(DuLinkList L)
{
DuLinkList p=L;
while(p)
{

printf("%d\t",p->data);
p=p->next;
}
printf("\n");
return OK;
}

int main()
{
/*
DuLinkList head;
head = CreateEmptyList();
head = CreateList(head,15);
int i=5;
data_t data=12;
PrintList(head);
printf("插入head第%d个位置,数据为%d\n",i,data);
ListInsert(head,i,data);
printf("插入后链表为:\n");
PrintList(head);
i=8;
ListDelete(head,i,&data);
printf("删除head第%d个位置,删除数据为%d\n",i,data);
printf("删除后链表为:\n");
PrintList(head);
if(ClearList(head)==OK)
{
printf("head已被成功删除!\n");
}
*/
return 0;
}
线性表之链式存储(单向循环列表)
//注意:该文件操作的单循环链表为带头结点单循环链表,头结点数据为-1,但在数据操作过程中头结点不参与
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define ERROR 0

typedef int data_t;
typedef struct CirNode
{
data_t data;
struct CirNode *next;
}CirNode,*CirLinkList;

int GetElem(CirLinkList L,int i,data_t *data)//读取循环链表的第i个元素
{
int j;
CirLinkList p;
p = L;
j = 0;
if(!p->next)
{
printf("链表为空!\n");
return ERROR;
}
else
{
do
{
p=p->next;
j++;
}while(p->next!=L->next && j<i);
}
*data = p->data;
return OK;
}

int ListInsert(CirLinkList L,int i,data_t e)//在第i个节点后面插入节点使新节点成为第i+1号节点
{
int j;
CirLinkList p,s;
if(i==0)//如果要使新节点成为第1个节点,还要操作当前链表表尾的next
{
p=L->next;
while(p->next!=L->next)
p=p->next;
s=(CirLinkList)malloc(sizeof(CirNode));
s->data=e;
s->next=L->next;
L->next=s;
p->next=s;
return OK;
}
else
{
p=L;
j=1;
do
{
p=p->next;
}while(p->next!=L->next && i>j++);
if(j<i)
{
printf("第%d个位置不存在!\n",i);
return ERROR;
}
s=(CirLinkList)malloc(sizeof(CirNode));
s->data=e;
s->next=p->next;
p->next=s;
}
return OK;
}

int ListDelete(CirLinkList L,int i,data_t *e)
{
int j;
CirLinkList p,q;
if(L->next==NULL)
{
printf("链表为空\n");
return ERROR;
}
if(i==1)
{
p=q=L->next;
while(p->next!=L->next)
p=p->next;
L->next=q->next;
p->next=q->next;
*e=q->data;
free(q);
return OK;
}
else
{
p=L;
j=1;
do
{
p=p->next;
j++;
}while(p->next!=L->next && j<i);
if(p->next==L->next)
{
printf("第%d个位置不存在!\n",i);
return ERROR;
}
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
}
return OK;
}

CirLinkList CreateEmptyList()
{
CirLinkList p;
p = (CirLinkList)malloc(sizeof(CirNode));
if(p==NULL)
{
perror("创建循环链表失败");
exit(0);
}
p->data=-1;//无效数据
p->next=NULL;
return p;
}

CirLinkList CreateList(CirLinkList L,int n)
{
CirLinkList p,r;
int i;
srand(time(NULL));
r = L;
for(i=0;i<n;i++)
{
p = (CirLinkList)malloc(sizeof(CirNode));
p->data = rand()%100+1;
r->next = p;
r = p;
}
r->next = L->next;//将表尾接入1号节点
return L;
}

int ClearList(CirLinkList L)
{
CirLinkList p,q;
p=L->next;
while(p->next!=L->next)
{
q=p->next;
free(p);
p=q;
}
free(p);//处理最后一个节点
L->next=NULL;
return OK;
}

int PrintList(CirLinkList L)
{
CirLinkList p=L;
if(!p->next)
{
printf("链表为空\n");
return ERROR;
}
else
{
do
{
p=p->next;
printf("%d\t",p->data);
}while(p->next!=L->next);
}
printf("\n");
return OK;
}

int main()
{
/*
CirLinkList head;
head = CreateEmptyList();
head = CreateList(head,10);
PrintList(head);
int i=5;
data_t data=12;
printf("插入head第%d个位置,数据为%d\n",i,data);
ListInsert(head,i,data);
printf("插入后链表为:\n");
PrintList(head);
i=8;
ListDelete(head,i,&data);
printf("删除head第%d个位置,删除数据为%d\n",i,data);
printf("删除后链表为:\n");
PrintList(head);
if(ClearList(head)==OK)
{
printf("head已被成功删除!\n");
}
return 0;
*/
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章