单链表的练习-头插法

/*单链表的练习-头插法*/
/*单链表由头结点就可以唯一确定*/
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
//定义单链表结构
typedef struct Node{
	int data;  //数据域
	Node * pNext;  //指针域
}NODE,* PNODE;

PNODE create_list(void);  //创建链表
void show_list(PNODE pHead);  //显示链表
void insert(PNODE pHead,int pos,int inval); //向链表中某个位置插入元素
int deleteList(PNODE pHead,int pos); //删除链表某个位置上的值
void find(PNODE pHead,int fval);  //在链表中查找某个元素

void main(){
	PNODE pHead = NULL;  //定义一个头结点,初始值为空
	pHead = create_list();
	show_list(pHead);
	insert(pHead,2,100);
	show_list(pHead);
	find(pHead,3);
	printf("你所删除的值是%d\n",deleteList(pHead,2));
	show_list(pHead);
}

PNODE create_list(void){
	int length,val;
	PNODE pHead = (PNODE)malloc(sizeof(NODE));  //向内存申请头节点空间
	pHead->pNext=NULL;   //开始的时候只有头结点自身,没有其它结点
	if(NULL == pHead){
		printf("分配失败,程序终止");
		exit(-1);
	}
	printf("请输入需要生成的单链表的长度:");
	scanf("%d",&length);
	for(int i=0;i<length;i++){    //for循环生成指定个数的结点
		printf("请输入第%d个节点的值: ",i+1);
		scanf("%d",&val);
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL == pNew){
		printf("分配失败,程序终止");
		exit(-1);
		}
		pNew->data=val;   //给新申请的结点数据域赋值
		pNew->pNext=pHead->pNext;  //头指针指向的下一个结点的地址赋给了新结点的指针域,也就是在当前头结点后面直接插入一个新结点
		pHead->pNext=pNew; //头结点指向了新的结点

	}
	return pHead;   //函数返回头结点的地址
}

void show_list(PNODE pHead){
	printf("单链表的值如下:\n");
	PNODE P = pHead->pNext;
	while(P != NULL){      //while巡检打印出所以结点,直到下个结点不存在
		printf("%d ",P->data);
		P=P->pNext;
	}
	printf("\n");
}

void insert(PNODE pHead,int pos,int inval){
	PNODE P = pHead;
	int j=0;
	while(P != NULL && j<pos-1){   //如果结点不为空,把P指针移动到插入位置的前一个结点位置
		P = P->pNext;
		j++;
	}
	if(P == NULL){
		printf("插入失败\n");
		exit(-1);
	}else{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));  //申请新的结点
		pNew->data=inval;   //将要插入的值赋值给新结点的数据域
		pNew->pNext=P->pNext;  //新结点指向P指针指向的下一个结点
		P->pNext=pNew; //P指针所在的结点指向新结点
		printf("你已经成功的插入了元素%d到链表中.\n",inval);
	}
}

int deleteList(PNODE pHead,int pos){
	PNODE P = pHead,S;

	int j=0,x;
	if(P != NULL && j<pos-1){
		P = P->pNext;
		j++;
	}
	if(P == NULL){
		printf("删除失败,数组是空的");
		exit(-1);
	}else{
		S = P->pNext;
		P->pNext = S->pNext;
		x = S->data;
		free(S);
		return x;
	}
}

void find(PNODE pHead,int fval){
	PNODE P = pHead;
	int cnt=0;
	if(P == NULL){
		printf("不用找了,链表是空的\n");
		exit(-1);
	}
	while(P != NULL){
		P = P->pNext;
		++cnt;
		if(P->data==fval){
			printf("你要找的数%d在链表中,它在链表的第%d个位置\n",fval,cnt);
			break;
		}
	}
}

结果截图

时间: 2024-12-21 22:34:38

单链表的练习-头插法的相关文章

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

线性表的链式存储之单链表的尾插法

对单链表进行遍历.查找.插入.删除等操作,最终效果如下: 相关C代码如下: /*线性表的链式存储之单链表的尾插法*/ #include <stdio.h> #include <stdlib.h> #include <malloc.h> /*定义变量*/ typedef int DataType; typedef struct node{     //定义链表结点数据结构 DataType data; struct node * pNext; }NODE; typedef

【数据结构复习】链表的倒置(头插法倒置)

#include <bits/stdc++.h> using namespace std; typedef int ElemType; struct LNode{ ElemType data; LNode *next; }; LNode *head,*tail; void init(){ head = (LNode*)malloc(sizeof(LNode)); head->next = NULL; tail = head; } void input_data(){ int x; cin

数据结构之线性表——链式存储结构之单链表(php代码实现)

<?php /**  *  * 1. 类LNode用作创建单链表时,生成新的节点.  * 2. 类SingleLinkList用于创建单链表以及对单链表的一些操作方法(实例化此类就相当于创建了一个空链表)  * 3. CreateListHead: 具有$num个数据元素的单链表的创建--头插法  * 4. CreateListTail: 具有$num个数据元素的单链表的创建--尾插法  * 5. DestroyList: 销毁单链表  * 6. ClearList:清空单链表  * 7. Li

线性单链表的操作

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define INFEASIBLE -1 #define OVERFLOW -2 /* #define ElemType int #define Status int */ typedef int ElemType; typedef int Status; /* #define LNo

《数据结构》2.6单链表应用举例

1 //单链表倒置(头插法,时间复杂度O(n)) 2 /*算法思路: 3 依次取出原链表中的每个节点,每次都将其作为第一个节点插入原链表中:由于采用头插法,插入顺序与取节点 4 顺序正好相反,故可以完成倒置操作. 5 */ 6 void reverseList(LinkList h) //reverse:背面.相反.颠倒 7 { 8 LNode *p; 9 p = h->next; //*p指向第一个数据元素节点 10 h->next = NULL; //将原链表置为空表 11 while(p

判断单链表中是否有环(循环链表)

有环的定义:链表的尾结点指向了链表中的某个结点,如下图所示 判断是否有环,两种方法: 方法1:使用p.q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点看p走的步数和q是否一样,如上图所示:当p从6走到3时,共走了6步,此时若q从出发,则q只需要走两步就到达3的位置,因而步数不相等,出现矛盾,存在环. 方法2:快慢指针,定义p.q两个指针,p指针每次向前走一步,q每次向前走两步,若在某个时刻出现 p == q,则存在环. 具体代码实现: 1 #include<stdio.h> 2 #

线性表的链式存储-单链表

单链表操作 [x] 单链表的创建(尾插法.头插法) [x] 单链表的查找操作 [x] 单链表的删除操作 [x] 单链表的逆置操作(使用头插法) [x] 单链表表长的计算 [x] 打印单链表 单链表的创建 头插法 forward_list* creat_3() //头插法 { forward_list *head,*s; int num; head = NULL;//链表初始状态为空 while(scanf("%d",&num) && num) { s = (fo

如何使用C++实现单链表

线性表--链表 为什么假期也在发文章 //TODO NullGirlfrindException 请忽略以上两行无聊的事实...... 如何弥补顺序表的不足之处? 第一次学习线性表一定会马上接触到一种叫做顺序表(顺序存储结构),经过上一篇的分析顺序表的优缺点是很显然的,它虽然能够很快的访问读取元素,但是在解决如插入和删除等操作的时候,却需要移动大量的元素,效率较低,那么是否有一种方法可以改善或者解决这个问题呢? 首先我们需要考虑,为什么顺序表中的插入删除操作会涉及到元素的移动呢? 好家伙,问题就