动态链表的基本操作

该程序实现以下功能:

   1. initlist_l(lnode&L);    //建立一个带头结点的空链表

   2. locationelem(linklist L, int i, elemtype &e);    //在带头结点的单链表中查找第i个节点,若存在,则返回第i个元素的

值;否则返回error

   3. listinsert_l(linklist &L, ini i, elemtype e);    //在带头结点的单链表中第i个结点之前插入元素e

   4. listdelete_l(linklist &L, int i, elemtype &e);    //删除带头结点的单链表L上的第i个数据结点并用e返回其值

   5. createlist_l(linklist &L, int n);    //通过头插法建立一个含n个结点的单链表

   6. createlist_lt(linklist &L, int n);    //通过尾插法建立一个含n个结点的单链表

   7. display_l(linklist L);    //打印链表


程序如下:

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

typedef int elemtype;	//用户自定义数据类型
typedef struct lnode
{
	elemtype data;
	struct lnode *next;
}lnode, *linklist;	//结点类型

void initlist_l(linklist &L);
void createlist_l(linklist &L, int n);
void display_l(linklist L);	//打印链表
void locationelem(linklist L, int i, elemtype &e);
void listinsert_l(linklist &L, int i, elemtype e);
void listdelete_l(linklist &L, int i, elemtype &e);
void destroy_l(linklist &L);	//销毁链表

int main(void)
{
	elemtype e = 3, x, insertdata;
	int num, insertnum, deletenum, len;
	linklist L;
	initlist_l(L);	//通过函数分配内存空间
	printf("输入链表的长度:");
	scanf("%d", &len);
	createlist_l(L, len);	//建立含len个结点的链表
	display_l(L);
	printf("输入要显示的结点序号:");
	scanf("%d", &num);
	locationelem(L, num, e);
	printf("%d\n", e);
	printf("输入插入的位置:");
	scanf("%d", &insertnum);
	printf("插入的数字:");
	scanf("%d", &insertdata);
	listinsert_l(L, insertnum, insertdata);	//将insertdata插入链表的第insertnum结点之前
	display_l(L);
	printf("输入删除的结点序号:");
	scanf("%d", &deletenum);
	listdelete_l(L, deletenum, e);
	printf("删除结点的数据域是:%d\n", e);
	display_l(L);
	destroy_l(L);
	return 0;
}

void initlist_l(linklist &L)
{
	L = (linklist)malloc(sizeof(lnode));
	if (L == NULL)
		exit(1);
	L->next = NULL;
}

void locationelem(linklist L, int i, elemtype &e)
{
	linklist p = L;	//p指向表头
	int j = 0;	//j的初值为0, 即为头结点的序号
	while (j<i && p!=NULL)
	{
		p = p->next;
		j++;			//后移指针并计数
	}
	if (p == NULL || j > i)
	{
		printf("该结点不存在\n");
		return ;
	}
	e = p->data;
}

void createlist_l(linklist &L, int n)
{//头插法
	int i;
	linklist s;	//这里相当于 lnode *s;
	if (L == NULL)
		exit(3);
	printf("输入%d个整数:\n", n);
	for (i=0; i<n; i++)
	{
		s = (linklist)malloc(sizeof(lnode));
		if (s == NULL)	//判断s分配空间是否成功
			exit(4);
		scanf("%d", &s->data);
		s->next = L->next;
		L->next = s;
	}
}

void listdelete_l(linklist &L, int i, elemtype &e)
{
	int j = 0;
	linklist p, r = L;
	while (r->next && j<i-1)
	{//查找第i-1个节点
		r = r->next;
		j++;
	}
	if (r->next == NULL || j>i-1)
	{
		printf("链表中没有结点i\n");
		return ;
	}
	p = r->next;
	r->next = p->next;
	free(p);
}

void listinsert_l(linklist &L, int i, elemtype e)
{
	linklist s, r = L;
	int j = 0;
	while (r->next && j<i-1)
	{//找到第i-1个结点
		r = r->next;
		j++;
	}
	if (r == NULL || j>i-1)	//老老实实第写r == NULL, 不要刷帅写!r(很容易出错)
	{
		printf("链表的结点数小于i-1,或i<1\n");
		return ;
	}
	s = (linklist)malloc(sizeof(lnode));
	if (s == NULL)
		exit(4);
	s->data = e;
	s->next = r->next;
	r->next = s;
}

void display_l(linklist L)
{
	printf("当前链表值为:\n");
	linklist p = L->next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

void destroy_l(linklist &L)
{//一个一个地删除结点
	linklist p = L->next;
	while (p)
	{
		L->next = p->next;
		free(p);
		p = L->next;
	}
	free(L);
	printf("链表已销毁\n");
}



尾插法:

void create_lt(linklist &L, int n)
   {
		linklist r = L, s;
		int i;
		while (r->next)
			r = r->next;
		for (i=0; i<n; i++)
		{
			s = (linklist)malloc(sizeof(lnode));
			if (s == NULL)
				exit(5);
			scanf("%d", &s->data);
			s->next = r->next;
			r->next = s;
			r = s;
		}
   }


posted on 2012-11-17 07:59  zm001  阅读(252)  评论(0编辑  收藏  举报