数据结构和算法(C语言)

链表的基本操作:

代码:

/**
作者:一叶扁舟
时间:23:43 2016/8/28 and 23:00 2016/8/31
作用:链表的基本操作和将链表逆置功能
**/

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef struct LinkNode{
	int data;
	LinkNode *next;
}LinkNode;

//从键盘中输入数据,然后建立成链表
LinkNode *Creat_SList(LinkNode **pHead);
int SqList_Print(LinkNode *pHead);
//在结点数值为x的前面插入y
int SqList_NodeInsert(LinkNode *pHead, int x, int y);
//删除结点为y的链表结点
int SqList_NodeDel(LinkNode *pHead, int y);
//保持表头不变,然后逆置链表
void SqList_reverse(LinkNode *pHead);
//创建链表
LinkNode *Creat_SList(){
	//1.准备环境
	LinkNode *pHead = NULL;
	LinkNode *pCurrent = NULL;
	LinkNode *tempNode = NULL;
	//创建头结点
	pHead = (LinkNode*)malloc(sizeof(LinkNode));
	pHead->next = NULL;
	pCurrent = pHead;

	if (pHead == NULL){
		return NULL;
	}
	int inputData = 0;
	printf("请输入一个数据(-1结束):");
	scanf("%d", &inputData);

	while (inputData != -1){
		//2创建临时空间
		tempNode = (LinkNode*)malloc(sizeof(LinkNode));
		tempNode->data = inputData;
		tempNode->next = NULL;
		//3.链表的建立
		pCurrent->next = tempNode;
		pCurrent = pCurrent->next;	
		printf("请输入一个数据(-1结束):");
		scanf("%d", &inputData);
	}
	return pHead;
};
//输出链表
int SqList_Print(LinkNode *pHead){
	if (pHead == NULL){
		return -1;
	}
	LinkNode *pCurrent = pHead->next;
	printf("链表的结果:\n");
	while (pCurrent != NULL){
		printf("%3d ",pCurrent->data);
		pCurrent = pCurrent->next;
	}
	printf("\n");
	return 0;
}
//在结点数值为x的前面插入y,如果没有则插在最后的位置
int SqList_NodeInsert(LinkNode *pHead, int x, int y){
	if (pHead == NULL){
		return NULL;
	}
	//1.环境准备
	LinkNode *pCurrent = pHead->next;
	LinkNode *pPre = pHead;
	LinkNode *tempNode;
	//2.生成一个结点
	tempNode = (LinkNode*)malloc(sizeof(LinkNode));
	tempNode->data = y;
	tempNode->next = NULL;

	//3.查找X数据的位置
	while (pCurrent != NULL){
		if (pCurrent->data == x){
			break;
		}
		pPre = pCurrent;
		pCurrent = pCurrent->next;
	}
	//3.插入数据
	pPre->next = tempNode;
	tempNode->next = pCurrent;
	return 0;
};
//删除结点为y的链表结点
int SqList_NodeDel(LinkNode *pHead, int y){
	LinkNode *pCurrent = pHead ->next;
	LinkNode *pPre = pHead;
	//要删除的临时结点
	LinkNode *pTemp = NULL;
	if (pHead == NULL){
		return -1;
	}
	//1.先查询是否在链表中,如果不在链表中返回-1
	//2.查询出来后删除
	while (pCurrent != NULL){
		if (pCurrent->data == y){
			//查询到删除的结点
			pTemp = pCurrent;
			pPre->next =pCurrent->next;
			pCurrent = pCurrent->next;
			free(pTemp);
		}else{
			//往后移动
			pPre = pCurrent;
			pCurrent = pCurrent->next;
		}
	}//while
	if (pTemp == NULL){
		return -1;
	}
	else{
		return 0;
	}

};
//保持表头不变,然后逆置链表
void  SqList_reverse(LinkNode *pHead){
	LinkNode *pCurrent = pHead->next;
	pHead->next = NULL;
	LinkNode *pTemp;
	if (pHead == NULL){
		return;
	}
	while (pCurrent != NULL){
		//提前保存下一个结点
		pTemp = pCurrent->next;
	//将当前结点前插入链表中
		pCurrent->next = pHead->next;
		pHead->next = pCurrent;
		pCurrent = pTemp;
	}
};
void main(){
	LinkNode *pHead;
	pHead = Creat_SList();
	printf("-------------------链表的建立------------\n");
	SqList_Print(pHead);

	//插入数据
	SqList_NodeInsert(pHead, 20, 19);
	printf("插入后的数据:\n");
	//插入数据
	SqList_NodeInsert(pHead, 330,119);
	printf("插入后的数据:\n");
	SqList_Print(pHead);

	//删除指定数据
	int delNum =0;
	printf("\n请输入要删除的数据:");
	scanf("%d",&delNum);
	SqList_NodeDel(pHead,delNum);
	printf("删除后的数据:\n");
	SqList_Print(pHead);

	SqList_reverse(pHead);
		printf("链表逆置后的数据:\n");
	SqList_Print(pHead);
	system("pause");
}

代码运行图:

数据结构和算法(C语言)_第1张图片


你可能感兴趣的:(数据结构和算法,数据结构,算法,c语言)