线性表--链式存储

代码内容来自《大话数据结构》

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define OK 		1
#define ERROR 	0
#define TRUE 	1
#define FALSE	0

#define MAXSIZE 20
 
typedef int Status;
typedef int ElemType;

struct Node{
	ElemType data;
	struct Node* next;
};

typedef struct Node* LinkList;

Status visit(ElemType c){
	printf("%d ",c);
	return OK;
}

Status InitList(LinkList L){
	L->next = NULL;
	return OK;
}

Status ListEmpty(LinkList L){
	if(L->next){
		return FALSE;
	}
	return TRUE;
}

Status ClearList(LinkList L){
	LinkList p,q;
	p = L->next;
	while(p){
		q = p->next;
		free(p);
		p =q;
	}
	L->next = NULL;
	return OK;
}

int ListLength(LinkList L){
	int i = 0;
	LinkList p = L->next;
	while(p){
		i++;
		p = p->next;
	}
	return i;
}

Status GetElem(LinkList L,int i,ElemType *e){
	int j;
	LinkList p;
	p = L->next;
	j = 1;
	while(p && j<i){
		p = p->next;
		j++;
	}
	if( !p || j>=i){
		return ERROR;
	}
	*e = p->data;
	return OK;
}

int LocateElem(LinkList L,ElemType e){
	int i = 0;
	LinkList p = L->next;
	while(p){
		i++;
		if(p->data == e){
			return i;
		}
		p = p->next;
	}
	return 0;
}

Status ListInsert(LinkList L, int i,ElemType e){
	int j;
	LinkList p,s;
	p = L;//不要写成p = L->next,因为插入的位置可能是头结点
	j = 1;
	while(p && j<i){
		p = p->next;
		j++;
	}
	if( !p || j>i){
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(struct Node));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

Status ListDelete(LinkList L,int i,ElemType *e){
	int j;
	LinkList p,q;
	p = L;
	j = 1;
	while(p->next && j<i){
		p = p->next;
		j++;
	}
	if(!p->next || j>i){
		return ERROR;
	}
	q = p->next;
	p->next = q->next;
	*e = q->data;
	free(q);
	return OK;
}

Status ListTraverse(LinkList L){
	LinkList p = L->next;
	while(p){
		visit(p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}

void CreateListHead(LinkList L,int n){
	LinkList p;
	int i;
	srand(time(0));
	for(i = 0;i<n; i++){
		p = (LinkList)malloc(sizeof(struct Node));
		p->data = rand()%100 +1;
		p->next = L->next;
		L->next = p;
	}
}

void CreateListTail(LinkList L,int n){
	LinkList p,r;
	int i;
	srand(time(0));
	r = L;
	for(i = 0; i < n; i++){
		p = (LinkList)malloc(sizeof(struct Node));
		p->data = rand()%100 +1;
		r->next = p;
		r = p;
	}
	r->next = NULL;
}
int main(){
	LinkList L = (LinkList)malloc(sizeof(struct Node));//头结点
    ElemType e;
    Status i;
    int j,k;
    i=InitList(L);
    printf("初始化后,L是否为空:%d\n",ListEmpty(L));

    CreateListTail(L,10);
	ListTraverse(L);

	for(j = 1; j <= 5; j++){
		i = ListInsert(L,i,j);
	}
	ListTraverse(L);

	k = ListLength(L);
	printf("L.length: %d\n",k);

	i = ListDelete(L,1,&e);
	if(i==ERROR){
		printf("删除失败\n");
	} else {
		printf("删除的数是 %d\n",e);
	}

	ListTraverse(L);

	i=ClearList(L);
    printf("\n清空L后:ListLength(L)=%d\n",ListLength(L));
}

  

posted @ 2018-04-14 16:03  寻觅beyond  阅读(212)  评论(0)    收藏  举报
返回顶部