#include<stdio.h>
#include<stdlib.h>
enum bool {false,true};
typedef struct LNode{
char data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *,char []);
void ClearList(LinkList);
enum bool ListEmpty(LinkList);
void ListInsert(LinkList,char,int);
void delElem(LinkList,char);
void ShowList(LinkList );
/*void InitList(LinkList *l,char e[]){//头插法
int i = 0;
LNode *p,*q;
q = (LNode *)malloc(sizeof(LNode));
for(;i<2;i++){
p = (LNode *)malloc(sizeof(LNode));
p->data = e[i];
p->next = q->next;
q->next = p;
}
*l=q;
}*/
void InitList(LinkList *l,char e[]){
int i = 0;
LNode *p,*q;
q = (LNode *)malloc(sizeof(LNode));
*l = q;
q->next = NULL;
for(;i<2;i++){
p = (LNode *)malloc(sizeof(LNode));
p->data = e[i];
p->next = q->next;
q->next = p;
q=p;
}
}
enum bool ListEmpty(LinkList l){
if(l->next==NULL){
return true;
}
return false;
}
void ClearList(LinkList l){
LinkList p,q;
p = l;
q = l->next;
while(q!=NULL){
p->next = q->next;
free(q);
q = p->next;
}
}
void ShowList(LinkList l){
if(ListEmpty(l)){
printf("The Linklist is empty!\n");
}else{
LinkList q;
q=l->next;
while(q!=NULL){
printf("%c\t",q->data);
q = q->next;
}
printf("\n");
}
}
void ListInsert(LinkList l,char e,int i){
LinkList p;
p=l;
int j = 0;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i){
printf("error");
}
else{
LinkList s;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
}
void delElem(LinkList l,char e){
LinkList p,q;
p = l;
q = l->next;
while(q){
if(q->data==e)break;
p=q;
q=q->next;
}
p->next = q->next;
free(q);
}
int getElem(LinkList l, char e){
int i = 0;
LinkList p;
p=l->next;
while(p){
if(p->data==e)break;
i++;
p=p->next;
}
return i;
}
int main(){
char elements[] = {'a','b'};
LinkList l=NULL;
InitList(&l,elements);
ShowList(l);
ListInsert(l,'c',2);
ShowList(l);
delElem(l,'b');
ShowList(l);
int index;
index = getElem(l,'a');
printf("%d\n",index);
ClearList(l);
ShowList(l);
}
用链表来表示线性表,还有循环链表,双向链表其中算法很多都是相同的,循环链表的特点是最后一个指针指向头指针,双向链表特点是每个结构体都存在两个指针,一个指向前一个结构体,一个纸箱后一个结构体。线性表的子集还包括栈,队列。
网友评论