数据结构——03双向链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

一、线性表的链式存储

1.描述

	解决的问题:
	线性表的链式存储解决顺序存储的缺点,插入和删除,动态存储问题。
	特点:
	线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占用的位置上。
	表示方法:
	在链式结构中还需要一个元素存储下一个元素的地址。为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针域。这两部分信息组成数据元素ai的存储映像,叫结点(Node);
	

2.线性表与顺序表的对比

顺序表和链表 优缺点
	存储方式:
		顺序表是一段连续的存储单元
		链表是逻辑结构连续物理结构(在内存中的表现形式)不连续
	时间性能,
		查找 顺序表O(1)
			 链表  O(n)
		插入和删除
			顺序表 O(n)
			链表   O(1)
			
	空间性能
			顺序表 需要预先分配空间,大小固定
			链表, 不需要预先分配,大小可变,动态分配

二、双向链表

1.文件结构

代码如下(示例):

	.
├── all
├── fun.c
├── fun.o
├── head.h
├── main.c
├── main.o
└── Makefile

0 directories, 7 files

2.代码示例

代码如下(示例):

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

typedef struct person {
	char name[32];
	char sex;
	int age;
	int score;
}DATATYPE;

typedef struct Node
{
	DATATYPE data;
	struct Node *pro;
	struct Node *next;
}LinkNode;

typedef struct list {
	LinkNode *head;
	int clen;
}LinkList;

typedef enum{
	FORWORD,
	BACKWORD,
}DIRECT;

LinkList *CreateLinkList();
int InsertHeadLinkList(LinkList *list, DATATYPE *data);
int ShowLinkList(LinkList *list,DIRECT dircur);
LinkNode *FindLinkList(LinkList *list, char *name);
int DeleteLinkList(LinkList *list, char *name);
int ReviseLinkList(LinkList *list, char *name, DATATYPE *data);
int DestroyLinkList(LinkList **list);
int InsertTailLinkList(LinkList *list, DATATYPE *data);

#endif

fun.c

#include "head.h"
LinkList *CreateLinkList()
{
	LinkList *temp = malloc(sizeof(LinkList));
	if(NULL == temp)
	{
		perror("CreateLinkList error");
		return NULL;
	}
	temp->head = NULL;
	temp->clen = 0;
	return temp;
}
int InsertHeadLinkList(LinkList *list, DATATYPE *data)
{
	LinkNode *newnode = malloc(sizeof(LinkNode));
	if(NULL == newnode)
	{
		printf("malloc error");
		return -1;
	}
	memcpy(&newnode->data,data,sizeof(*data));
	newnode->pro = NULL;
	newnode->next = NULL;
	if(list->clen == 0)
	{
		printf("1\n");
		list->head = newnode;
	}
	else
	{
		newnode->next = list->head;
		list->head->pro = newnode;
		list->head = newnode;
	}
	list->clen++;
	return 0;
}
int ShowLinkList(LinkList *list,DIRECT dircur)
{
	LinkNode*temp = list->head;
	if(dircur == FORWORD)
	{
		while(temp != NULL)
		{
			printf("%s:%c:%d:%d\n",temp->data.name
					,temp->data.sex
					,temp->data.age
					,temp->data.score
				  );
			temp = temp->next;
		}
	}
	else
	{
		while(temp->next != NULL)
		{
			temp = temp->next;
		}
		while(temp)
		{
			
			printf("%s:%c:%d:%d\n",temp->data.name
					,temp->data.sex
					,temp->data.age
					,temp->data.score
				  );
			temp = temp->pro;
		}
	}
	return 0;
}
int InsertTailLinkList(LinkList *list, DATATYPE *data)
{
	LinkNode * newnode = malloc(sizeof(LinkNode));
	if( NULL == newnode)
	{
		perror("malloc error");
		return -1;
	}
	memcpy(&newnode->data,data,sizeof(*data));
	newnode->pro = NULL;
	newnode->next = NULL;
	if(0 == list->clen)
	{
		list->head = newnode;
	}
	else if( 1 == list->clen)
	{
		list->head->next = newnode;
		newnode->pro = list->head;
	}
	else
	{
		LinkNode*temp = list->head;
		while(temp->next)
		{
			temp = temp->next;
		}
		temp->next = newnode;
		newnode->pro = temp;
	}
	list->clen++;
	
	return 0;
}
LinkNode *FindLinkList(LinkList *list, char *name)
{
	LinkNode *temp =list->head;
	while(temp != NULL)
	{
		if(0 == strcmp(temp->data.name,name))
		{
			return temp;
			break;
		}
		temp = temp->next;
	}
	return NULL;
}
int DeleteLinkList(LinkList *list, char *name)
{
	LinkNode*temp = FindLinkList(list,name);
	if(temp)
	{
		if(temp->pro == NULL)
		{
			temp->next->pro = NULL;
			list->head = temp->next;
		}
		else 
		{
			if(temp->next)
			{
				temp->next->pro = temp->pro;
			}
			temp->pro->next = temp->next;
		}
		free(temp);
		list->clen--;
	}
	else
	{
		printf("this data not find\n");
	}
	return 0;
}
int ReviseLinkList(LinkList *list, char *name, DATATYPE *data)
{
	LinkNode*temp = FindLinkList(list,name);
	if(temp)
	{
		memcpy(&temp->data,data,sizeof(DATATYPE));
	}
	else
	{
		printf("not find\n");
	}
	return 0;
}
int DestroyLinkList(LinkList **list)
{
	while(1)
	{
		LinkNode* temp = (*list)->head;
		if(temp == NULL)
		{
			break;
		}
		if(temp->next)
		{
			temp->next->pro = NULL;
		}
		(*list)->head = temp->next;
		free(temp);
		temp = temp->next;
	}
	free(*list);
	*list = NULL;
	return 0;
}

main.c


#include "head.h"

int main(int argc, const char *argv[])
{

	DATATYPE data[] = {
		{"zhangsan",'f',20,100},
		{"lisi",'f',20,100},
		{"wangmazi",'f',20,100},
		{"guanerge",'f',20,100},
		{"niuda",'f',20,100},
		{"huahua",'f',20,100},

	};
	
	LinkList*list = CreateLinkList();
	
	InsertTailLinkList(list,&data[0]);
	InsertTailLinkList(list,&data[1]);
	InsertTailLinkList(list,&data[2]);
	InsertTailLinkList(list,&data[3]);
#if 0	
	LinkNode*temp = FindLinkList(list,"zhangsan1");
	if(temp )
	{
		printf("%s %c\n",temp->data.name
				,temp->data.sex
				)
			;
	}
	else
	{
		printf("not find\n");
	}
#endif
	ShowLinkList(list,FORWORD);
	printf("---------------------\n");
	ShowLinkList(list,BACKWORD);
	DestroyLinkList(&list);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值