線性表(下)之鏈式存儲之雙向,單向循環列表

線性表之鏈式存儲(雙向循環鏈表)
//注意:該文件操作的鏈表爲帶頭結點雙向鏈表,頭結點數據爲-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;
*/
}


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