请多指教,如有错误或不足可在评论区留言,我会修改。
1.节点结构体实现:
/*
*1.data表示数据项,next表示指针项,指向下个节点。
*2.LNode和*LinkList是节点结构体的别名。LNode表示普通节点,LinkList表
* 式头节点
*/
typedef struct LNode {
int data;//数据域类型我这里用的是int,可自定义.
struct LNode * next;
}LNode,*LinkList;
2.单链表初始化:
/*
*参数传递一个头指针指向一个空节点,注意使用malloc分配内存时导入头部申明
*#include <stdlib.h>
*/
LinkList initList(LinkList l){
l=(LNode *)malloc(sizeof(LNode));//分配内存
l->next = NULL;
return l;
}
3.创建单链表
3.1头插法
void createfromhead(LinkList l){
//定义节点指针变量p,用来指向新插入的节点。
LNode * p;
//定义键盘输入结束标记标量i
int i = 1;
//定义数据项变量
int j;
while(i!=0){
//输入插入节点的数据项,我的数据项是整数。
scanf("%d",&j);
//判断键盘输入的整数是否为-1,是则结束循环。
if(j!=-1){
//将分配一段LNode类型的内存空间,指针p指向它
p = (LNode *)malloc(sizeof(LNode));
//将键盘输入的变量i的值赋给指针p所指向的节点的数据项
p->data = j;
//将原来头指针所指向节点的指针项赋给新增节点的指针域
p->next = l->next;
//将头指针所指向节点的指针域改为新增节点的指针p
l->next = p;
}else{
i=0;
}
}
}
3.2尾插法
//将新节点插入到结尾
void createfromtail(LinkList l){
LNode * p;
LNode * node;
node = l;
int i = 1;
int j;
while(i!=0){
scanf("%d",&j);
if(j!=-1){
p = (LNode *)malloc(sizeof(LNode));
p->data = j;
p->next = NULL;
node->next = p;
node = p;
}else{
i=0;
}
}
}
4.插入
//插入
void ListInsert(LinkList l){
int i;
int j;
int k=0;
printf("插入的值:\n");
scanf("%d",&i);
printf("插入的位置为:\n");
scanf("%d",&j);
LNode * p;
LNode * node;
node = l;
p = (LNode *)malloc(sizeof(LNode));
p->data = i;
while(node->next != NULL && k<j-1){
node = node->next;
++k;
}
if(!node->next || k>j){
printf("输入的区间有误\n");
return;
}
p->next = node->next;
node->next = p;
}
5.遍历
//遍历
void getElems(LinkList l){
printf("链表的内容为:\n");
LNode * node;
node = l;
while(node->data != NULL){
printf("%d\n",node->data);
node = node->next;
}
}
6.取值
6.1按位置取值
int getElem(LinkList l){
int i;
int j = 0;
printf("要去第几个值:");
scanf("%d",&i);
while(l->next != NULL && j < i){
l = l->next;
++j;
}
if(!l->next || j>i){
printf("输入的节点位置有误\n");
return NULL;
}
printf("值为:%d\n",l->data);
return l->data;
}
6.2按值取位置
int locateElem(LinkList l){
LNode *p = l->next;
int i;
int j = 1;
printf("要取的值是:");
scanf("%d",&i);
while(p && p->data != i){
p = p->next;
j++;
}
if(!p){
printf("未找到元素%d在链表中的位置\n",i);
return -1;
}
printf("%d在链表中的位置:%d\n",i,j);
return j;
}
7.删除
//删除单链表中指定位置的元素
void ListDelete(LinkList l){
int i;
LNode * node;
node = l;
printf("删除节点位置:\n");
scanf("%d",&i);
int j = 0;
while(node->next != NULL && j<i-1){
node = node->next;
++j;
}
if(!node->next || j>i-1){
printf("输入的区间有误\n");
return;
}
LNode * p;
p=node->next;
node->next = p->next;
free(p);
}
完整代码:
#include <stdio.h>
//#include <conio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode * next;
}LNode,*LinkList;
//初始化
LinkList initList(LinkList l){
l=(LNode *)malloc(sizeof(LNode));//分配内存
l->next = NULL;
return l;
}
//将新节点插入到开头
void createfromhead(LinkList l){
LNode * p;
int i = 1;
int j;
while(i!=0){
scanf("%d",&j);
if(j!=-1){
p = (LNode *)malloc(sizeof(LNode));
p->data = j;
p->next = l->next;
l->next = p;
}else{
i=0;
}
}
}
//将新节点插入到结尾
void createfromtail(LinkList l){
LNode * p;
LNode * node;
node = l;
int i = 1;
int j;
while(i!=0){
scanf("%d",&j);
if(j!=-1){
p = (LNode *)malloc(sizeof(LNode));
p->data = j;
p->next = NULL;
node->next = p;
node = p;
}else{
i=0;
}
}
}
//遍历
void getElems(LinkList l){
printf("链表的内容为:\n");
LNode * node;
node = l;
while(node->data != NULL){
printf("%d\n",node->data);
node = node->next;
}
}
//取值
int getElem(LinkList l){
int i;
int j = 0;
printf("要去第几个值:");
scanf("%d",&i);
while(l->next != NULL && j < i){
l = l->next;
++j;
}
if(!l->next || j>i){
printf("输入的节点位置有误\n");
return NULL;
}
printf("值为:%d\n",l->data);
return l->data;
}
//查找数据元素在链表中的位置
int locateElem(LinkList l){
LNode *p = l->next;
int i;
int j = 1;
printf("要取的值是:");
scanf("%d",&i);
while(p && p->data != i){
p = p->next;
j++;
}
if(!p){
printf("未找到元素%d在链表中的位置\n",i);
return -1;
}
printf("%d在链表中的位置:%d\n",i,j);
return j;
}
//插入
void ListInsert(LinkList l){
int i;
int j;
int k=0;
printf("插入的值:\n");
scanf("%d",&i);
printf("插入的位置为:\n");
scanf("%d",&j);
LNode * p;
LNode * node;
node = l;
p = (LNode *)malloc(sizeof(LNode));
p->data = i;
while(node->next != NULL && k<j-1){
node = node->next;
++k;
}
if(!node->next || k>j){
printf("输入的区间有误\n");
return;
}
p->next = node->next;
node->next = p;
}
//删除单链表中指定位置的元素
void ListDelete(LinkList l){
int i;
LNode * node;
node = l;
printf("删除节点位置:\n");
scanf("%d",&i);
int j = 0;
while(node->next != NULL && j<i-1){
node = node->next;
++j;
}
if(!node->next || j>i-1){
printf("输入的区间有误\n");
return;
}
LNode * p;
p=node->next;
node->next = p->next;
free(p);
}
int main(){
LinkList l;
l = initList(l);
createfromhead(l);
//createfromtail(l);
//getElem(l);
int i = getElem(l);
//ListInsert(l);
//ListDelete(l);
//getElem(l);
//int i = locateElem(l);
return 0;
}