/*
*数据结构:线性表的链式表示
*单链表
*线性表元素序号从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 *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->next = NULL;
while(scanf("%c",&ch) != EOF && ch != '\n'){
s = (LNode *)malloc(sizeof(LNode));
s->data = ch;
s->next = L->next;
L->next = s;
L->length++;
//scanf("%c",&ch);
}
return L;
}
LinkList createList2(LinkList &L){
char ch;
L = (LinkList)malloc(sizeof(LNode));
L->length = 0;
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;
r = s;
L->length++;
}
r->next = NULL; //让尾指针指向NULL
return L;
}
LNode *getElem(LinkList L,int i){
int j = 1;
LNode * s = L->next;
while(s && j < i){
s = s->next;
j++;
}
return s;
}
LNode *locateElem(LinkList L,ElemType e){
LNode *s = L->next;
while(s && 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;
p->next = s->next;
s->next = p;
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;
free(p);
L->length--;
}
void printList(LinkList L){
LNode *s = L->next;
while(s){
printf("%c ",s->data);
s = s->next;
}
printf("\n");
}
bool emptyList(LinkList L){
if(L->next == NULL){
return true;
}else{
return false;
}
}
void destroyList(LinkList &L){
while(L->next != NULL){
LNode *tmp = L;
L = L->next;
free(tmp);
}
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);
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");
return 0;
}
in.txt:
abcepoui
apple