双向循环链表C代码实现
#include <stdio.h>
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *prior;
struct Node *next;
}Node;
typedef struct Node * LinkList;
Status creatLinkList(LinkList *L){
*L = (LinkList)malloc(sizeof(Node));
if (*L == NULL) {
return ERROR;
}
(*L)->next = (*L);
(*L)->prior = (*L);
LinkList p = *L;
for(int i=0; i < 10;i++){
LinkList temp = (LinkList)malloc(sizeof(Node));
temp->data = i;
p->next = temp;
temp->prior = p;
temp->next = (*L);
p->prior = temp;
p = p->next;
}
return OK;
}
Status LinkListInsert(LinkList *L, int index, ElemType e){
LinkList p = (*L);
int i = 1;
if(*L == NULL) return ERROR;
while (i < index && p->next != *L) {
p = p->next;
i++;
}
if (i > index) return ERROR;
LinkList temp = (LinkList)malloc(sizeof(Node));
if (temp == NULL) return ERROR;
temp->data = e;
temp->prior = p;
temp->next = p->next;
p->next = temp;
if (*L != temp->next) {
temp->next->prior = temp;
}else{
(*L)->prior = temp;
}
return OK;
}
Status Display(LinkList L){
if (L == NULL) {
printf("打印的双向循环链表为空!\n\n");
return ERROR;
}
printf("双向循环链表内容: ");
LinkList p = L->next;
while (p != L) {
printf("%d ",p->data);
p = p->next;
}
printf("\n\n");
return OK;
}
Status LinkListDelete(LinkList *L,int index,ElemType *e){
int i = 1;
LinkList temp = (*L)->next;
if (*L == NULL) {
return ERROR;
}
if(temp->next == *L){
free(*L);
(*L) = NULL;
return OK;
}
while (i < index) {
temp = temp->next;
i++;
}
*e = temp->data;
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
return OK;
}
int main(int argc, const char * argv[]) {
printf("Hello, World!\n");
LinkList L;
Status iStatus;
ElemType temp,item;
iStatus = creatLinkList(&L);
printf("双向循环链表初始化是否成功(1->YES)/ (0->NO): %d\n\n",iStatus);
Display(L);
printf("输入要插入的位置和数据用空格隔开:");
scanf("%d %d",&temp,&item);
iStatus = LinkListInsert(&L,temp,item);
Display(L);
printf("输入要删除位置:");
scanf("%d",&temp);
iStatus = LinkListDelete(&L, temp, &item);
printf("删除链表位置为%d,结点数据域为:%d\n",temp,item);
Display(L);
return 0;
}