您的位置:首页 > 编程语言 > C语言/C++

c语言线性表的链式表示和实现

2017-11-21 09:13 633 查看
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这存储单元可以使连续的,也可以是不连续的)它包括另个域,数据与和指针域,数据域用来存储数据元素信息,指针域中存储的信息称为指针或链,n个节点链成一个链表,即为线性表的链式存储结构。代码的实现如下:
/*
* 数据结构线性表链式结构的实现
*/
#include<stdio.h>
#include<stdlib.h>
/*
ADT List{
//基本操作:
InitList(&L);       	//操作结果:构造一个空的线性表;
DestroyList(&L);    	//初始条件:线性表L已存在		操作结果:销毁线性表 L ;
ListEmpty(&L);	 		//初始条件:线性表L已存在		操作结果:若L为空表,则返回TRUE,否则,返回FALSE ;
ListLength(&L);	 		//初始条件:线性表L已存在		操作结果:若返回L中元素的个数 ;
GetElem(&L,i,e);		//初始条件:线性表L已存在		操作结果:用e返回L中第i个数据元素的值;
ListInsert(&L,i,e); 	//初始条件:线性表L已存在,1<=I<=LiseLenght(L)+1		操作结果:第i个元素之前插入元素e ,L+1;
ListDelete(&L,i,&e); 	//初始条件:线性表L已存在,1<=I<=LiseLenght(L)		操作结果:删除第i个元素,并用e返回其值,L-1 ;
ListTraverse(&l,width)	//初始条件:线性表L已存在,		操作结果:依次输出元素;
};
*/
#define TURE 1
#define FALSE 0
#define SUCC 1
#define ERROR 0
#define LISTINCREMENT 1
#define LIST_INIT_SIZE 20

typedef int ElemType;
typedef int Status;

typedef struct LNode{//线性表单链表存储结构
ElemType data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;

Status InitList(LinkList L){
//初始化链表
if(L!=NULL){
L->data=0;
L->next=NULL;//头结点是链表的尾
}
return SUCC;
}

Status Destroy(LinkList L){
//L存在,销毁链表L
LinkList Pc,Pn;
Pc=Pn=L->next;//pc pn赋值为L的指针域
if(L!=NULL){//pc非空时,依次释放Pc,Pc新值为Pn
Pn=Pc->next;
free(Pc);
Pc=Pn;
}
return SUCC;
}

Status ListEmpty(LinkList L){
//初始条件:线性表L已存在		操作结果:若L为空表,则返回TRUE,否则,返回FALSE
if(L->next)
return FALSE;
else
return TURE;
}

Status ListLength(LinkList L){
//初始条件:线性表L已存在		操作结果:若返回L中元素的个数
int Length;
LinkList p=L;
for(Length=0;p->next;Length++)
p=p->next;
return Length;
}
Status GetElem_L(LinkList L,int i, ElemType *e) {
// L为带头结点的单链表的头指针。
// 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LinkList p;
int j = 1;
p = L->next;          // 初始化,p指向第一个结点,j为计数器
while (p && j<i) {   // 顺指针向后查找,直到p指向第i个元素或p为空
p = p->next;  ++j;
}
if ( !p || j>i ) return ERROR;  // 第i个元素不存在
*e = p->data;   // 取第i个元素
return SUCC;
}

Status FillNumbers(LinkList L, int Total,ElemType e){
LinkList pT=L,pnode;
int i;
if(pT!= NULL) {
// 尾插法
for (i=0;i<Total;e++,i++){
// 创建新节点
pnode = (LNode * ) malloc (sizeof(LNode));
pnode->data = e;
pnode->next = NULL;
// 将新节点链接到表尾
pT->next= pnode;
pT = pnode;
}
}
return SUCC;
}

Status ListTraverse(LinkList L,int width){
//初始条件:线性表L已存在,		操作结果:依次输出元素;
int i=0;
LinkList pc = L->next;
if(L != NULL) {
while(pc){
i++;
printf("%3d",pc->data);
if( i%width ==0 || pc->next ==  NULL )
printf("\n");
pc = pc->next;
}
}
printf("\n");
return SUCC;
}

Status ListInsert(LinkList L,int i ,ElemType e){
// 在带头结点的单链线性表L的第i个元素之前插入元素e
LinkList p,s;
int j = 0;
p = L;
while (p && j < i-1) {  // 寻找第i-1个结点
p = p->next;
++j;
}
if (!p || j > i-1) return ERROR;      // l不存在,i小于1或者大于表长
s = (LinkList)malloc(sizeof(LNode));  // 生成新结点
s->data = e;  s->next = p->next;      // 插入L中
p->next = s;
return SUCC;
}

Status ListDelete(LinkList L, int i, ElemType *e) {
// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p,q;
int j = 0;
p = L;
while (p->next && j < i-1) {  // 寻找第i个结点,并令p指向其前趋
p = p->next;
++j;
}
if (!(p->next) || j > i-1) return ERROR;  // 删除位置不合理
q = p->next;
p->next = q->next;           // 删除并释放结点
*e = q->data;
free(q);
return SUCC;
}

void main(){
int i, j , k ,n ,m;
LNode head;
LinkList Mylist=&head;
InitList(Mylist);
printf("%d\n",ListEmpty(Mylist));

FillNumbers(Mylist,15,3);
printf("%d\n",ListLength(Mylist));
printf("%d\n",ListEmpty(Mylist));
ListTraverse(Mylist,5);

ListInsert(Mylist,10,14);
ListDelete(Mylist,8,&n);
ListTraverse(Mylist,5);
printf("%d\n",n);
}





上便是我总结的数据结构线性链表的相关知识和代码,有不足之处请多多指出,代码多为课本教材的参考总结和自己的灵活想象。

参考教材:《数据结构(C语言版)》严蔚敏 吴伟民 · 清华大学出版社
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息