2019-02-06 单链表的整表创建及增删插

#include<cstdio>
#include<iostream>
#include<ctime>
using namespace std;
#define MAXSIZE 20
typedef int Elemtype;
typedef int Status;		//Status表示状态

typedef struct Node
{
	Elemtype data;
	struct Node* next;
}Node;

typedef struct Node* LinkList;  //定义LinkList



Status GetElem(LinkList L,int i,Elemtype *e)	//用e返回L中第i个元素的值
{
	int j=1;
	LinkList p;
	p = L->next;	//让p指向链表L的第一个结点 	
	while(p&&j<i)	//p不为空且j还没有等于i
	{
		p = p->next;	//p指向下一个结点
		++j;
	}
	if(!p || j>i)
		return false;
	*e = p->data;	//e返回i个元素的数据
	return true;
}


Status ListInsert(LinkList* L,int i,Elemtype e)		//在L的第i个位置前插入新的数据元素e并使L的长度加1
{
	int j=1;
	LinkList p,s;
	p = *L;
	j = 1;
	while(p&&j<i)
	{
		p = p->next;
		++j;
	}
	if(!p||j>i)
		return false;
	s = (LinkList)malloc(sizeof(Node));	//生成新的结点s
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

Status ListDelete(LinkList* L,int i,Elemtype* e)	//删除L的第i个数据元素,用e返回其值,L的长度减1
{
	int j=1;
	LinkList p,q;
	p = *L;
	while(p->next&&j<i)
	{
		p = p->next;
		++j;
	}
	if(!(p->next) || j>i)
		return false;
	q = p->next;
	p->next = q->next;
	*e = q->data;
	free(q);		//让系统回收此结点,释放内存
	return true;
}


/*单链表的整表创建---头插法*/
void CreateListHead(LinkList* L,int n)		//随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)
{
	LinkList p;
	int i;
	srand(time(0));		//初始化随机数种子
	*L = (LinkList)malloc(sizeof(Node));
	(*L) -> next = NULL;
	for(i=0;i<n;i++)
	{
		p = (LinkList)malloc(sizeof(Node));
		p->data = rand()%100 + 1; //随机生成100以内的数字
		p->next = (*L)->next;
		(*L)->next = p;
	}
}


/*单链表的整表创建---尾插法*/
void CreateListTail(LinkList* L,int n)
{
	LinkList p,r;
	int i;
	srand(time(0));
	*L = (LinkList)malloc(sizeof(Node));
	r = *L; 	//r为指向尾部的结点
	for(i=0;i<n;i++)
	{
		p=(LinkList)malloc(sizeof(Node));
		p->data = rand()%100+1;
		r->next = p;
		r = p;
	}
	r->next = NULL;
}

头插法和尾插法划重点


来自大话数据结构一书 发现数据结构好难肯啊QAQ 看起来逻辑挺简单,一用C语言实现脑袋就乱七八糟,最后还是照着书打了一遍

posted @ 2019-02-06 23:27  roccoshi  阅读(132)  评论(0编辑  收藏  举报