指针-C语言单链表的插入求解了

问题描述

C语言单链表的插入求解了

对于带有头结点的链表,为什么在插入方法需要传入头指针的地址(二重指针)?对于不带头结点的链表,插入或者删除第一个元素时,需要使用头指针的地址,可是对于带头结点链表,为何要呢?

解决方案

解决方案二:

C语言不像C++,没有引用参数,所以参数的形参被改变不能作用到实参上。
比如
void foo(int i)
{
i = 2;
}

int i = 1;
foo(i); // i还是1

为此,需要指针:

void foo(int* i)
{
*i = 2;
}

int i = 1;
foo(&i); // 这样i=2了

这里需要初始化一个指针,指针本身相当于那个i,改变指针的指针指向的对象,才能给一个新的指针。

解决方案三:

传入头节点的地址后,你在函数中改变链表在调用的地方也可以生效,但是如果直接传头节点,那么你就要在函数中return头节点,然后在调用处接收

解决方案四:

(原创)C语言单链表插入
单链表插入c语言实现

解决方案五:

这里配有测试代码,
插入删除操作仅仅传入头结点的地址(一重指针),
没有传入头指针的地址(二重指针),
这个程序测试过后没有问题,还请大家能够指导

#include
#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
//定义节点的结构体
struct Node{
ElemType data;
struct Node* next;
};
typedef struct Node Node;

Status ListInit(Node** L,int n);//单链表初始化函数
Status GetElem(Node* L,int i,ElemType e);//获取单链表指定位置的元素
Status ListInsert(Node
L,int i,ElemType e);
Status ListDelete(Node* L,int i,ElemType e);
void printList(Node
L);

int main(){
Node* L;
int q = 0;
ListInit(&L,2);//初始化出一个联邦
ListInsert(L,3,3);//链表三号位置插入一个元素
ListInsert(L,4,4);//链表四号位置插入一个元素
if(ListDelete(L,3,&q)==OK)//删除三号位置上的元素
printf("q==%d
",q);
printf("打印单链表的所有数据
");
printList(L);
return 0;
}

//单链表初始化函数
//创建带有N个结点的单链表
//所有数据域初始化为零
Status ListInit(Node** L,int n){
Node* head = (Node*)malloc(sizeof(Node));//申请内存来创建头结点
Node* p = NULL;
if(head==NULL)
return ERROR;
head->data = 0;
head->next = NULL;
L = head;
//用头插法来创建各节点
for(int i = 0;i<n;i++){
p = (Node
)malloc(sizeof(Node));
p->data = 0;
p->next = (*L)->next;
(*L)->next = p;
}
return OK;
}
//传入带有头结点单链表的头指针(就是传入头结点的地址)
Status GetElem(Node* L,int i,ElemType e){
int j = 1;
Node
p = L->next;//让p指向链表的第一个元素
while(p!=NULL && j
p = p->next;
j++;
}
//如果传入i的位置不对返回错误
//p==NULL说明所选择的位置超出链表的长度了
//j>i说明i==0
if(p==NULL||j>i)
return ERROR;
*e = p->data;
return OK;
}

//在单链表第i个元素的前面插入元素
//传入的是单链表的头指针的地址来的
//部分书籍这个函数的定义是
//Status ListInsert(Node** L,int i,ElemType e)
Status ListInsert(Node* L,int i,ElemType e){
Node* p = NULL;
int j;
p = L;//p指向连表的头结点了
j = 0;
while(p!=NULL && j
p = p->next;
j++;
}
//p==NULL说明所选择的位置超出链表的长度了
//j>i-1表示i
if(p==NULL || j>i-1){
return ERROR;
}
//如果能走到这一步
//说明p已经指向了第i-1个元素了
Node * s = (Node*)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}

/*
删除单链表第i个位置上的元素
有些数据这个函数的定义是
Status ListDelete(Node** L,int i,ElemType e)
/
Status ListDelete(Node
L,int i,ElemType e){
Node
p = L;//让P指向单链表头结点
Node* q = NULL;
int j = 0;
while(p->next!=NULL && j
p = p->next;
j++;
}
if(p->next==NULL || j>i-1)
return ERROR;
//走到这里说明P指向了第i-1个元素了
*e = p->next->data;
q = p->next;
p->next = p->next->next;
free(q);
return OK;
}

/*
打印链表里的所有元素
/
void printList(Node
L){
L = L->next;//让L指向链表的第一个元素
while(L!=NULL){
printf("%d ",L->data);
L = L->next;
}
printf("
");
}

时间: 2024-12-31 19:37:30

指针-C语言单链表的插入求解了的相关文章

C语言之单链表的插入、删除与查找_C 语言

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.要实现对单链表中节点的插入.删除与查找的功能,就要先进行的单链表的初始化.创建和遍历,进而实现各功能,以下是对单链表节点的插入.删除.查找功能的具体实现: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int ElemType; /** *链表通用类型 *ElemType 代表自定义的数据类型 *struct

c语言 单链表-单链表的插入 中的问题

问题描述 单链表的插入 中的问题 要求:在带头节点的单链表llist中,p所指的节点后面插入元素x q->info=x;q->link=p->link;p->link=q;return 1; 其实我想问,p和p->link分别指的是什么意思啊??跪求大神指点!!! 解决方案 q->info=x;//将待插入的 节点的info成员赋上值 q->link=p->link; //将待插入节点的link指针指向p的下一个节点(此时p的link指针和q的link指针都

C语言单链表的实现_C 语言

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表结构: SList.h #pragma once typedef int DataType; typedef struct SListNode { DataType data; struct SListNode* next; }SListNode; // 如果要修改链表就必须加引用 SListNode* _BuyNode(DataType x); //建立节点 void PrintSlist(SListNode

数据结构的C++实现之程序加图示分析单链表的插入和删除操作

下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点 ,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示. 下面先来看程序( 栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见<单链表反转>,否则程序后面 的while循环输出的顺序是250,200,100),接着来分析程序: /* linkedlist.h */#ifndef LINKEDLIST_H#define LINKEDLIST_Htype

插入删除-数据结构单链表的插入与删除

问题描述 数据结构单链表的插入与删除 设单链表某一节点为p,怎样在p节点前插入一个结点?怎样删除p节点自身?(要求:用Java语言写出具体程序语言) 解决方案 这个主要是定位问题,只要能定到节点p的位置就好. List list = new LinkedList(); list.add(list.indexOf(p), "插入内容");//由于是链表结构,所以数据插入位置的后方下标自动后移 list.remove(list.indexOf(p));//删除p节点 就是这个思路,不知道对

struct-@数据结构大神,单链表的插入,47行怎么错了?求解释~

问题描述 @数据结构大神,单链表的插入,47行怎么错了?求解释~ include include typedef struct Node { char data; struct Node *next; }Node,*Linklist;//先定义.后使用 //定义数据L-分配头节点-插入数据,连接-返回 Linklist Createfromhead() { Linklist L;Node*s;int flag=1;char c; L=(Linklist)malloc(sizeof(Node));

Go语言单链表实现方法_Golang

本文实例讲述了Go语言单链表实现方法.分享给大家供大家参考.具体如下: 1. singlechain.go代码如下: 复制代码 代码如下: ////////// //单链表 -- 线性表 package singlechain //定义节点 type Node struct {     Data int     Next *Node } /* * 返回第一个节点 * h 头结点  */ func GetFirst(h *Node) *Node {     if h.Next == nil {  

C语言单链表常见操作汇总_C 语言

C语言的单链表是常用的数据结构之一,本文总结了单链表的常见操作,实例如下: #include<stdio.h> #include<stdlib.h> //定义单链表结构体 typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; //创建单链表 void Build(LinkList L) { int n; LinkList p,q; p=L; pr

@数据结构大神,单链表的插入,56行怎么错了?求解释~

问题描述 @数据结构大神,单链表的插入,56行怎么错了?求解释~ include include typedef struct Node { char data; struct Node *next; }Node,*Linklist;//先定义.后使用 //定义数据L-分配头节点-插入数据,连-接-返回 Linklist Createfromhead() { Linklist L;Node*s;int flag=1;char c; L=(Linklist)malloc(sizeof(Node))