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

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这存储单元可以使连续的,也可以是不连续的)它包括另个域,数据与和指针域,数据域用来存储数据元素信息,指针域中存储的信息称为指针或链,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语言版)》严蔚敏 吴伟民 · 清华大学出版社


  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
线性表是一种常见的数据结构,它包含了一组有序的元素,元素之间具有前驱和后继关系。线性表链式表示是其中一种实现方式。 线性表链式表示通过使用节点和指针来表示表中元素之间的关系。具体来说,每个节点中都包含了一个元素和一个指向下一个节点的指针。通过不断地遍历指针,就可以顺着链表找到表中的所有元素。 链式表示的优点是可以动态地插入和删除元素,而不需要移动其他元素。这是因为链表中的节点通过指针相互连接,可以在任意位置插入和删除元素。同时,链式表示可以节省内存空间,因为节点不需要连续的存储空间,可以灵活地分配内存。 实现链式表示的方式是使用结构体来定义节点和指针。节点结构体中包含了一个元素和一个指向下一个节点的指针。使用指针的方式可以实现链表节点之间的相互连接。 在C语言中,可以通过定义一个节点结构体来表示链表的节点,然后使用指针指向链表的头节点。通过遍历指针,可以遍历整个链表,并对链表进行插入、删除等操作。 总之,线性表链式表示通过节点和指针的方式来实现表中元素之间的关系。链式表示可以动态地插入和删除元素,并且节省内存空间。在C语言中,可以通过定义节点结构体和指针来实现链式表示实现链表的各种操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值