1.3单链表附

1.h文件

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

//结点类型声明 
typedef int ElemType;
struct LinkNode{
	ElemType Elem;
	LinkNode *Next;
};

// 创建一个链表结点 
LinkNode *LinkCreateNode(ElemType Elem) {
    LinkNode *node = (LinkNode *) malloc ( sizeof(LinkNode) );
    node->Elem = Elem;
    node->Next = NULL;
    return node;
}
//结点类型声明 
//typedef struct Node{
//	ElemType Elem;
//	struct Node *Next;
//}LinkNode,*LinkList;
 
//初始化 
void InitList(LinkNode *&L){
	L=(LinkNode*)malloc(sizeof(LinkNode));
	L->Next=NULL; 
}

//销毁
void DestroyList(LinkNode *&L){
	LinkNode *pre=L,*p=L->Next;
	while(p!=NULL){
		free(pre);
		pre=p;
		p=pre->Next;
	}
	free(pre);
} 

//判断是否为空
bool EmptyList(LinkNode *L){
	return (L->Next==NULL);
} 


//求长度
int ListLength(LinkNode *L){
	int n=0;
	LinkNode *p=L;
	while(p->Next!=NULL){
		n++;
		p=p->Next;
	}
	return (n);
} 

//输出
void DispList(LinkNode *L){
	LinkNode *p=L->Next;
	while(p!=NULL){
		printf("%d ",p->Elem);
		p=p->Next;
	}	
	printf("\n");
} 

//求数据元素值 
bool GetElem(LinkNode *L,ElemType i,ElemType &e){
	int j;
	LinkNode *p=L;
	for(j=0;j<i;j++){
		p=p->Next;
		e=p->Elem;
	}
	if(p==NULL)
	return false;
	else
	return e;
}


//按值查找元素 
int LocateElem(LinkNode *L,ElemType e){
	int n=0;
	LinkNode *p=L;
	while(p->Elem!=e&&p!=NULL){
		n++;
		p=p->Next;
	}
	if(p==NULL)
	return 0;
	else 
	return (n);
}


//头插法
void CreateListF(LinkNode *&L,ElemType a[],int n){
	LinkNode *s;
	L=(LinkNode *)malloc(sizeof(LinkNode));
	L->Next=NULL;
	for(int i=0;i<n;i++){
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->Elem=a[i];
		s->Next=L->Next;
		L->Next=s;
	}
} 


//尾插法
void CreateListR(LinkNode *&L,ElemType a[],int n){
	LinkNode *s,*r;
	L=(LinkNode *)malloc(sizeof(LinkNode));
	r=L;
	for(int i=0;i<n;i++){
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->Elem=a[i];
		r->Next=s;
		r=s;
	}
	r->Next=NULL;
} 

 
//删除
int ListDeleteNode(LinkNode *&L,int i){
 	LinkNode *p=L,*q;
 	int j=0;
 		for(int j=0;j<i-1;j++){
 			p=p->Next;
		 }
		 if(!(p->Next)||(j>i-1))
		 return 0;
 		q=p->Next;
 		p->Next=q->Next;
 		free(q);
 		return 1;
 } 

//插入 
bool ListInsert(LinkNode *&L,int i,ElemType e){
	int j=1;
	LinkNode *p=L->Next,*s;
	while(j<i-1&&p!=NULL){
		p=p->Next;
		j++;
	}
	if(p==NULL)
	return false;
	else{
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->Elem=e;
		s->Next=p->Next;
		p->Next=s;
		return true;
	}
}


//插入 
//LinkNode *ListInsertNode(LinkNode *head, int i, ElemType v) {
//    LinkNode *pre, *aft, *vtx;                     // (1) 插入完毕后,  pre -> vtx -> aft 
//    int j = 0;                                     // (2) 定义一个计数器,当 j == i 时,表明找到要插入的位置 
//    pre = head;                                    // (3) 从链表头开始 
//    while(pre && j < i) {                          // (4) 如果还没有到链表尾,或者没有找到插入位置则继续循环 
//        pre = pre->Next;                           // (5) 游标指针指向它的后继结点 
//        ++j;                                       // (6) 计数器加 1 
//    }
//    if(!pre) { 
//        return NULL;                               // (7) 元素个数不足,无法找到给定位置,返回 NULL 
//    }
//    vtx = LinkCreateNode(v);                       // (8) 创建一个值为 v 的鼓孤立结点 
//    aft = pre->Next;                               // (9) - (11) 为了串成  pre -> vtx -> aft 
//    vtx->Next = aft;                               // (10)
//    pre->Next = vtx;                               // (11)
//    return vtx;                                    // (12) 返回插入的那个结点 
//}


//删除
//LinkNode *ListDeleteNode(LinkNode *head, int i) {
//    LinkNode *pre, *del, *aft;
//    int j = 0;
//    if(head == NULL) {
//        return NULL;              // (1) 空链表,无法执行删除,直接返回 
//    }
//    if(i == 0) {                  // (2) 需要删除链表第 0 个结点 
//        del = head;               // (3) 缓存第 0 个结点       
//        head = head->Next;        // (4) 将新的链表头结点变为当前头结点的后继结点 
//        free(del);                // (5) 调用系统库函数 free 释放内存 
//        return head;              // (6) 返回新的链表头结点 
//    }
//    
//    pre = head;                   // (7) 执行链表结点的游走 
//    while(pre && j < i - 1) {     // (8) 找到将要被删除结点的前驱结点 
//        pre = pre->Next;
//        ++ j;
//    }
//    if(!pre || !pre->Next) {      // (9) 如果前驱结点为空,或者需要被删除的结点为空,则直接返回当前链表头 
//        return head;
//    }
//    del = pre->Next;              // (10) 缓存需要删除的结点到 del 
//    aft = del->Next;              // (11) 缓存删除结点的后继结点到 aft 
//    pre->Next = aft;              // (12) 将需要删除的结点的前驱结点指向它的后继结点 
//    free(del);                    // (13) 释放需要删除结点的内存空间 
//    return head;                  // (14) 返回新的链表头结点 
//}  

.cpp文件

#include<stdio.h>
#include"1.h"
int main(){
	LinkNode *L;
	printf("(1)初始化线性表\n");
	InitList(L);
	ElemType a[]={8,10,12,16,18};
	CreateListR(L,a,5);
	printf("(3)输出线性表:\n");
	DispList(L);	
	printf("(4)表长度为:%d\n",ListLength(L));
	printf("(5)判断表为:%s\n",EmptyList(L)?"空":"非空");
	ElemType e;
	GetElem(L,5,e);
	printf("(6)第5个元素为:%d\n",e);
	printf("(7)输出元素16的位置为:%d\n",LocateElem(L,16));
	ListInsert(L,5,14);
	printf("(8)在第5个元素的位置插入14这个元素\n");
	printf("(9)输出表");
	DispList(L);	
	printf("(10)删除第5个元素\n");
	ListDeleteNode(L,5);
	printf("(11)输出表");
	DispList(L);	
}

运行结果:

(1)初始化线性表
(3)输出线性表:
8 10 12 16 18
(4)表长度为:5
(5)判断表为:非空
(6)第5个元素为:18
(7)输出元素16的位置为:4
(8)在第5个元素的位置插入14这个元素
(9)输出表8 10 12 16 14 18
(10)删除第5个元素
(11)输出表8 10 12 16 18

--------------------------------
Process exited after 0.2504 seconds with return value 0
请按任意键继续. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值