/*
*数据结构:线性表的静态链式表示
*单链表 静态链表
*线性表元素序号从1算起
*L[0]专设为头结点
*Date:2017/4/14
*/
#include <stdio.h>
#include <stdlib.h>
#define InitSize 100
#define ElemType char
typedef struct LNode{
ElemType data;
int length;
int next; //next为指针,next==1相当于指针为NULL
bool free; //free=true,表示此空间已被利用;free=false,表示此空间未被利用
}LinkList[InitSize];
void initList(LinkList L); //静态链表初始化
void createList1(LinkList &L); //头插法建立单链表
void createList2(LinkList &L); //尾插法建立单链表
int getElem(LinkList L,int i); //按序号查找表结点值
int 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); //销毁链表
void initList(LinkList L){
int i;
for(i=0;i<InitSize;i++){
L[i].free = false;
}
}
void createList1(LinkList &L){
char ch;
L[0].length = 0;
L[0].next = -1;
L[0].free = true;
int i = 1;
while(scanf("%c",&ch) != EOF && ch != '\n' && L[0].length < InitSize){
L[i].data = ch;
L[i].next = L[0].next;
L[0].next = i;
L[i].free = true;
L[0].length++;
i++;
//scanf("%c",&ch);
}
// return L;
}
void createList2(LinkList &L){
char ch;
L[0].length = 0;
L[0].next = -1; //让尾指针指向-1
L[0].free = true;
int i = 1;
while(scanf("%c",&ch) != EOF && ch != '\n' && L[0].length < InitSize){
L[i].data = ch;
L[i-1].next = i;
L[i].next = -1;
L[i].free = true;
L[0].length++;
i++;
}
// return L;
}
/*LNode getElem(LinkList L,int i){
int j = 1;
int j = L[0].next;
while(j != -1 && j != i){
j = L[j].next;
}
return L[j];
}*/
int getElem(LinkList L,int i){
int j = 1;
int pos = L[0].next;
while(pos != -1 && j < i){
pos = L[pos].next;
j++;
}
return pos;
}
int locateElem(LinkList L,ElemType e){
int pos = L[0].next;
while(pos != -1 && L[pos].data != e){
pos = L[pos].next;
}
return pos;
}
int findFree(LinkList L){
int i = 1;
while(L[i].free && i < InitSize){
i++;
}
return i;
}
void listInsert(LinkList L,int i,ElemType e){
if(L[0].length < InitSize){
int j = getElem(L,i-1);
int index = findFree(L); //找到空位置
L[index].data = e;
L[index].next = L[j].next;
L[j].next = index;
L[0].length++;
}
}
void listDelete(LinkList L,int i,ElemType *e){
int j = getElem(L,i-1);
int pos = L[j].next;
*e = L[pos].data;
L[j].next = L[pos].next;
L[pos].free = false;
L[0].length--;
}
void printList(LinkList L){
int i = L[0].next;
while(i != -1){
printf("%c ",L[i].data);
i = L[i].next;
}
printf("\n");
}
bool emptyList(LinkList L){
if(L[0].next == -1){
return true;
}else{
return false;
}
}
void destroyList(LinkList L){ //L是静态数组
int i;
for(i=0;i<InitSize;i++){
L[i].free = false;
}
printf("已销毁链表");
}
int lengthList(LinkList L){
return L[0].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");
}*/
initList(L1);
initList(L2);
createList1(L1);
createList2(L2);
printList(L1);
printList(L2);
printf("L1长度:%d\nL2长度:%d\n",lengthList(L1),lengthList(L2));
int s1 = getElem(L1,3);
printf("L1第3个位置:%c\n",L1[s1].data);
int s2 = getElem(L2,4);
printf("L2第4个位置:%c\n",L2[s2].data);
s1 = locateElem(L1,'e');
s2 = locateElem(L2,'p');
printf("s1 = locateElem(L1,'e'):%c\n",L1[s1].data);
printf("s2 = locateElem(L2,'p'):%c\n",L2[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");
return 0;
}
in.txt:
abcepoui
apple