链表的基本操作:
代码:
/**
作者:一叶扁舟
时间: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");
}
代码运行图: