现在的位置: 首页 > 综合 > 正文

线性表之离散存储(链表)

2018年05月02日 ⁄ 综合 ⁄ 共 1996字 ⁄ 字号 评论关闭

按照自己的思路写的简单的链表,仅有创建、插入、删除操作,
写的函数尽量仿造ADT上的基本操作,虽仍有些不同,应更易理解

一个带头结点的线性链表类型定义如下:
Status InitList(LinkList &L);
//构造一个空的线性链表
Status ListEmpty(LinkList L);
//若线性链表L为空表,则返回TRUE,否则返回FALSE
Status ListInsert(LinkList L, int i, ElemType e);
//在带头节点的单链线性表L的第i个元素之前插入元素e
Status ListDelete(LinkList L, int i, ElemType &e);
//删除带头节点的单链线性表L的第i个节点,并以e表示 

/*
目的:创建一个链表CreateList();
作用:可完成ListInsert(插入)、ListDelete(删除)、判断是否为空ListEmpty操作 
*/                                       ----《郝斌数据结构自学视频》、《数据结构C语言版》(严蔚敏)

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
	int date;
	struct Node *next;
}NODE, *PNODE;
int len;
/*****************创建链表***************/ 
PNODE CreateList(void){
	int i,val;	//val用来临时存放有效节点
	printf("请输入节点的个数: ");
	scanf("%d",&len); //输入要生成的链表的节点个数
	PNODE pHead = (PNODE)malloc(sizeof(NODE)); //生成头节点
	if(NULL==pHead){
			printf("分配失败,程序终止!\n");
			exit(-1);
	}
	 PNODE pTail = pHead; 
	 pTail->next = NULL;
	for(i=0; i<len; ++i){
		printf("输入第%d个节点: ",i+1);
		scanf("%d",&val);
	 	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	 	if(NULL==pNew){
			printf("分配失败,程序终止!\n");
			exit(-1);
		}
	 	pNew->date = val;
	 	pTail->next = pNew;
	 	pNew->next = NULL;
	 	pTail = pNew;
	}
	return pHead;   //返回头指针 
} 
/********判断是否为空*********/ 
bool ListEmpty(PNODE pHead){
	if(pHead->next==NULL)
		return 1;
	else
		return 0;
}
/*****************插入***************/ 
PNODE ListInsert(PNODE pHead, int pos, int e){
	if(pos>len+1||pos<1){
		printf("节点不存在,程序终止!\n");
		exit(-1);
	} 
	PNODE p = pHead;
	int t=0;
	while(t<pos-1){  //p在除去头结点后的pos-1个节点 
		p = p->next;
		t++;
	} 
	PNODE q = (PNODE)malloc(sizeof(PNODE));
	q->date = e;
	q->next = p->next;
	p->next = q;
}
/****************删除**************/
int ListDelete(PNODE pHead, int pos, int *e){
	if(pos>len||pos<1){
		printf("节点不存在,程序终止!\n");
		exit(-1); 
	}
	PNODE p = pHead;
	int t=0;
	while(t<pos-1){
		p = p->next;
		t++;
	} 
	PNODE q = p->next;
	*e = q->date;
	p->next = q->next;
	free(q);
	return 1;
}
/************遍历*************/ 
void ListTraverse(PNODE pHead){
	PNODE p = pHead->next;
	while(NULL!=p){
		printf("%d ",p->date);  //p从头指到尾 
		p = p->next; 
	}
	printf("\n");
}

int main(void){
	int e;
	PNODE pHead=NULL;
	pHead=CreateList();//创建链表 
	ListInsert(pHead,6,99); //将99插入到第6个位置 
/*  if( ListDelete(pHead,6,&e) ){//将第6个元素删除,同时显示删除的元素 
		printf("%d\n",e); 
	}*/
	ListTraverse(pHead);//遍历 
	return 0;
}


抱歉!评论已关闭.