1、 顺序表:
①需要一片连续的内存空间,成员可以随机访问,访问效率高
②插入删除数据存在数据搬移的现象,效率低
③存储密度高
链表的特点:
①不需要连续的内存空间,不能随机访问元素,访问效率低
②插入删除数据不存在数据搬移的现象,效率高
③存储密度比较低
2、
无头链表:第一个节点为数据节点,加入删除第一个节点,链表的入口发生改变,操作维护比较复杂
有头链表:浪费第一个节点作为头节点,作为操作维护链表的同一入口,操作维护链表比较简单
有头链表用的比较多
3、链表节点如何定义:
struct Link
{
data_t data;
struct Link *pNext;
}
4、链表的插入
pNode->pNext = pTmp->pNext;
pTmp->pNext = pNode;
5、链表的删除
pDel = pTmp->pNext;
pTmp->pNext = pDel->pNext;
free(pDel);
pDel = NULL;
循环链表
6、双向链表的定义:
struct int
{
data_t data;
struct Link *pPri;
struct Link *pNext;
}
7、插入
pNode->pNext = pTmp->pNext;
pTmp->pNext->pPri = pNode;
pNode->pPri = pTmp;
pTmp->pNext = pNode;
8、删除
pTmp->pNext = pDel->pNext;
pDel->pNext->pPri = pTmp;
free(pDel);
pDel = NULL;
Link.c
/*
**实现链表的创建、销毁、插入、删除、更新、遍历输出
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Link.h"
/*
**创建链表头节点
*/
Link* CreateLink()
{
Link *phead = NULL;
phead =(Link *)malloc(sizeof(Link));
if (NULL == phead)
{
printf("create link fault !\n");
return NULL;
}
memset(phead,0,sizeof(Link));
return phead;
}
/*
**销毁
*/
int DestroyLink(Link *phead)
{
if ( NULL == phead )
{
return LINK_ERR;
}
Link *pDel = NULL;
Link *pTmp = NULL;
pDel= phead->pNext;
while(NULL != pDel)
{
pTmp = pDel->pNext;
free(pDel);
pDel = pTmp;
}
free(phead);
phead = NULL;
pDel = NULL;
pTmp = NULL;
return LINK_OK;
}
/*
**创建一个链表节点
*/
Link* CreateNode( data_t tdata )
{
Link *pNode = NULL;
pNode = (Link*)malloc(sizeof(Link));
if ( NULL == pNode)
{
return pNode;
}
memset(pNode,0,sizeof(Link));
pNode->data = tdata;
return pNode;
}
/*
**首部插入一个链表的元素
*/
int InsertLinkItem(Link *phead,data_t idata,int Offset)
{
if ( NULL == phead )
{
return LINK_ERR;
}
Link *pN = CreateNode(idata);
Link *pTmp = phead;
switch ( Offset )
{
case 0 :
pN->pNext = phead->pNext;
phead->pNext = pN;
break;
/* case # :
#
break;*/
default:
while ( Offset--)
{
if ( NULL != pTmp->pNext)
{
pTmp = pTmp->pNext;
}
}
pN->pNext = pTmp->pNext;
pTmp->pNext = pN;
}
return LINK_OK;
}
/*
**链表的首部删除一个元素
*/
int DelLinkItem(Link *phead,data_t *pdata,int Offset)
{
if ( (NULL == pdata) || (NULL == phead) || (NULL == phead->pNext))
{
return LINK_ERR;
}
Link *pT = phead->pNext;
Link *pTmp = phead;
Link *pDel = NULL;
switch ( Offset )
{
case 0 :
*pdata = pT->data;
phead->pNext = pT->pNext;
free(pT);
pT = NULL;
break;
default:
while ( Offset--)
{
if ( NULL != pTmp->pNext)
{
pTmp = pTmp->pNext;
}
}
pDel = pTmp->pNext;
*pdata = pDel->data;
pTmp->pNext = pDel->pNext;
free(pDel);
pDel = NULL;
}
return LINK_OK;
}
/*
**更新链表中的数据元素
*/
int UpdateLink(Link *phead,data_t OldData,data_t NewData)
{
if ( NULL == phead)
{
return LINK_ERR;
}
Link *pTmp = phead->pNext;
while ( NULL != pTmp)
{
if ( OldData == pTmp->data)
{
pTmp->data = NewData;
}
pTmp = pTmp->pNext;
}
return LINK_OK;
}
/*
**遍历链表输出链表元素的值
*/
void ShowLink(Link *phead)
{
if ( NULL == phead)
{
return;
}
Link *pTmp = phead->pNext;
while ( NULL != pTmp)
{
printf("%5d",pTmp->data);
pTmp = pTmp->pNext;
}
printf("\n");
}
Link.h
#ifndef _LINK_H_
#define _LINK_H_
typedef int data_t;
typedef struct LINK
{
data_t data;
struct LINK *pNext;
}Link;
typedef enum LINK_OP
{
LINK_ERR = -1,
LINK_OK
}LINK_OP_ENUM;
Link* CreateLink();
int DestroyLink(Link *phead);
int InsertLinkItem(Link *phead,data_t idata,int Offset);
int DelLinkItem(Link *phead,data_t *pdata,int Offset);
int UpdateLink(Link *phead,data_t OldData,data_t NewData);
void ShowLink(Link *phead);
#endif /* _LINK_H_ */
main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Link.h"
int main()
{
Link *Ph = CreateLink();
if ( NULL == Ph)
{
printf("create link failed\n");
return -1;
}
int i = 0;
int ret = -1;
for ( i = 0 ; i < 10 ; i++ )
{
ret = InsertLinkItem(Ph, i,0);
if ( LINK_ERR == ret)
{
break;
}
}
ShowLink(Ph);
ret = InsertLinkItem(Ph, 88,5);
ShowLink(Ph);
ret = InsertLinkItem(Ph, 99,20);
ShowLink(Ph);
int num = -1;
ret = DelLinkItem(Ph, &num,0);
ShowLink(Ph);
ret = DelLinkItem(Ph, &num,3);
ShowLink(Ph);
ret = UpdateLink(Ph, 2, 0);
ShowLink(Ph);
DestroyLink(Ph);
return 0;
}