//这是C语言的写法,但会报错,原因是len(当前的节点长度)
//无法在insert(插入)和deleted(删除)之后改变
//不能使用delete是因为delete是C++中的一个运算符
//最终我把改程序用C++写了一遍,运用引用将len的真实值改变了
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct node {
ElementType data;
struct node *pNext;//指向下一个结点的指针
}Node, *pNode;//这里NODE等价于struct node、、PNODE等价于struct Node*
pNode Create_List(int len);
pNode change(pNode pHead,int len);
void ergodic(pNode pHead,int len);
pNode insert(pNode pHead,int *len);
int main() {
pNode pHead = NULL;//创建一个头结点
int len;//用来存放有效节点字数
printf("请输入节点个数:");
scanf("%d", &len);
pHead = Create_List(len);//创建一个单链表,并将该链表的头指针赋值给pHead
pNode p;//创建一个移动指针,指向需要访问的结点
ergodic(pHead,len);//遍历数据输出
p = change(pHead,len);//修改节点的数据
ergodic(pHead,len);//遍历数据输出
p = insert(pHead,&len);//插入一个节点
printf("此时len为:%d", len);
printf("\n插入成功\n");
ergodic(pHead,len);//遍历数据输出
return 0;
}
pNode Create_List(int len)//这里用PNODE表示返回一个结构体类型的指针
{
//创建链表
pNode pHead = (pNode)malloc(sizeof(Node));//分配一个不存放有效数据的头的头结点
//malloc返回的是一个节点,其中 (结构体类型的指针)malloc(sizeof(结构体的名称))
pNode pTail = pHead;//定义一个尾指针,并初始化
pTail->pNext = NULL;//将尾节点指针置空
int i;
int val;
for (i = 0; i<len; i++) {
printf("输入第%d个节点的数值:", i + 1);
scanf("%d", &val);
pNode pNew = (pNode)malloc(sizeof(Node));
//给下一个节点分配空间
pNew->data = val;//1.先把值赋给下一个结点
pTail->pNext = pNew;//新的节点的指针域pTail的指针域
pNew = NULL;//把为节点的指针域置空
pTail = pTail->pNext;//将尾指针+1指向最后一个节点
}
return pHead;//返回一个链表的头指针
}
//++++++++++++++++++++++++++++++
void ergodic(pNode pHead, int len) {
//遍历数据输出
pNode p;
p = pHead;//将移动指针指向头结点
int j;
for (j = 0; j<len; j++) {
p = p->pNext;
printf("第%d个节点的数值是:%d\n", (j + 1), p->data);
}
}
//++++++++++++++++++++++++++++++
pNode change(pNode pHead, int len) {
//修改节点的数据
pNode p;
p = pHead;
int value;
printf("修改节点的数据\n");
int k;
for (k = 0; k<len; k++) {
p = p->pNext;
printf("输入第%d个结点要修改的数据:", k + 1);
scanf("%d", &value);
p->data = value;
}
return pHead;
}
//+++++++++++++++++++++++++++++
//插入节点
pNode insert(pNode pHead, int *len) {
pNode p;
p = pHead;
printf("输入在第几个节点(头结点不算)后插入:");
int m;
scanf("%d", &m);
int i;
for (i = 0; i<m; i++) {
p = p->pNext;
}
pNode e = (pNode)malloc(sizeof(Node));
e->pNext = NULL;
printf("请输入该节点的数值:");
int n;
scanf("%d", &n);
e->data = n;
e->pNext = p->pNext;
p->pNext = e;
len++;
return pHead;
}
//+++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++
//删除节点
pNode delete(pNode pHead,int len){
pNode p;
pNode q;
p=pHead;
printf("请输入要删除第几个节点(不包含头结点)");
int k;
scanf("%d",&k);
int i;
for(i=0;i<k-1;i++){
p=p->pNext;
}
q=p->pNext;
p->pNext=q->pNext;
free(q);
q=NULL;
return pHead;
}
注释最全的C语言链表的增删改查
最新推荐文章于 2024-03-15 23:17:34 发布