/*
*数据结构:线性表的链式表示
*双链表 循环链表
*线性表元素序号从1算起
*Date:2017/4/13
*/
#include <stdio.h>
#include <stdlib.h>
#define InitSize 100
#define ElemType char
typedef struct LNode{
ElemType data;
int length;
struct LNode *prior,*next;
}LNode,*LinkList;
LinkList createList1(LinkList &L); //头插法建立双链表
LinkList createList2(LinkList &L); //尾插法建立双链表
LNode *getElem(LinkList L,int i); //按序号查找表结点值
LNode *locateElem(LinkList L,ElemType e); //按值按序号顺序查找表结点在链表L中第一次出现的位置
void listInsert(LinkList L,int i,ElemType e); //在第i个结点位置插入新结点,元素值为e
void listDelete(LinkList L,int i,ElemType *e); //删除第i个结点,用e返回删除元素的值
void printList(LinkList L); //按先后序号打印链表
bool emptyList(LinkList L); //判断链表是否为空,为空就返回true,否则返回false
int lengthList(LinkList L); //返回链表长度
void destoryList(LinkList &L); //销毁链表
LinkList createList1(LinkList &L){
LNode *s;
char ch;
L = (LinkList)malloc(sizeof(LNode));
L->length = 0;
L->prior = L; //初始化,头结点前驱指针指向本身
L->next = L; //初始化,头结点后继指针指向本身
while(scanf("%c",&ch) != EOF && ch != '\n'){
s = (LNode *)malloc(sizeof(LNode));
s->data = ch;
// if(L->next != L){ //若头结点的下一个结点不指向NULL
L->next->prior = s; //让头结点的下一个结点的前驱指针指向s
// }
s->next = L->next;
L->next = s;
s->prior = L; //让s的前驱指针指向L头结点
L->length++;
//scanf("%c",&ch);
}
return L;
}
LinkList createList2(LinkList &L){
char ch;
L = (LinkList)malloc(sizeof(LNode));
L->length = 0;
L->prior = L;
L->next = NULL;
LNode *s,*r=L;
while(scanf("%c",&ch) != EOF && ch != '\n'){
s = (LNode *)malloc(sizeof(LNode));
s->data = ch;
r->next = s;
s->prior = r; //让s的前驱指针指向尾指针r
r = s;
L->prior = r; //让头结点前驱指针向尾指针r
L->length++;
}
r->next = L; //让尾指针指向L
return L;
}
LNode *getElem(LinkList L,int i){
int j = 1;
LNode * s = L->next;
if(i == 0){
return L;
}
while(s!=L && j < i){
s = s->next;
j++;
}
return s;
}
LNode *locateElem(LinkList L,ElemType e){
LNode *s = L->next;
while(s!=L && s->data != e){
s = s->next;
}
return s;
}
void listInsert(LinkList L,int i,ElemType e){
LNode *s = getElem(L,i-1);
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = e;
// if(s->next != NULL){
s->next->prior = p;
// }
p->next = s->next;
s->next = p;
p->prior = s;
L->length++;
}
void listDelete(LinkList L,int i,ElemType *e){
LNode *s = getElem(L,i-1);
LNode *p = s->next;
*e = p->data;
s->next = p->next;
//if(p->next != NULL){
p->next->prior = s;
//}
free(p);
L->length--;
}
void printList(LinkList L){
LNode *s = L->next;
while(s!=L){
printf("%c ",s->data);
s = s->next;
}
printf("\n");
}
bool emptyList(LinkList L){
if(L->next == L && L->prior == L){
return true;
}else{
return false;
}
}
void destroyList(LinkList &L){
LNode *tmp,*tmpL = L;
while(L->next != tmpL){
tmp = L;
L = L->next;
free(tmp);
}
printf("\n%p\n",L);
printf("已销毁链表");
}
int lengthList(LinkList L){
return L->length;
}
int main(){
freopen("in.txt","r",stdin);
printf("/*************************双循环链表****************************/\n\n\n");
LinkList L1,L2;
/* if(emptyList(L1)){
printf("L1为空\n");
}else{
printf("L1不为空\n");
}*/
createList1(L1);
createList2(L2);
printList(L1);
printList(L2);
printf("L1长度:%d\nL2长度:%d\n",lengthList(L1),lengthList(L2));
LNode *s1 = getElem(L1,3);
printf("L1第3个位置:%c\n",s1->data);
LNode *s2 = getElem(L2,4);
printf("L2第4个位置:%c\n",s2->data);
printf("s2->prior->data:%c\n",s2->prior->data);
printf("s2->prior->prior->prior->data:%c\n",s2->prior->prior->prior->data);
s1 = locateElem(L1,'e');
s2 = locateElem(L2,'p');
printf("s1 = locateElem(L1,'e'):%c\n",s1->data);
printf("s2 = locateElem(L2,'p'):%c\n",s2->data);
listInsert(L1,2,'z');
printf("listInsert(&L1,2,'z') :");
printList(L1);
char e;
listDelete(L2,3,&e);
printf("listDelete(&L2,3,&e) : %c\n",e);
printList(L2);
if(emptyList(L1)){
printf("L1为空\n");
}else{
printf("L1不为空\n");
}
if(emptyList(L2)){
printf("L2为空\n");
}else{
printf("L2不为空\n");
}
printf("L1长度:%d\nL2长度:%d\n",lengthList(L1),lengthList(L2));
destroyList(L2);
printf("L2\n");
printf("\n%p\n",L2);
printf("L2 LENGTH :%d\n",L2->length);
printf("%p\n",L2->next);
return 0;
}
in.txt:
abcepoui
apple