废话不多说,直接上代码
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Node {
Elemtype data;
struct Node* next;//这里就是指向node的指针
}Node;
Node* initlist(int n);
void printlist(Node* l);
int insertlist(Node* l, int a, int b);
int deletelist(Node* l, int a);
int updatalist(Node* l, int a, int b);
int main() {
int n;
int a, b,c,d,e;
printf("请输入您想要生成的链表长度\n");
scanf("%d",&n);
Node* l=initlist(n);
printlist(l);
printf("请输入您想要插入的位置和数字\n");
scanf("%d,%d", &a, &b);
insertlist(l, a, b);
printlist(l);
printf("请输入您想要删除的的位置\n");
scanf("%d", &c);
deletelist(l, c);
printlist(l);
printf("请输入您想修改的位置\n");
scanf("%d,%d", &d, &e);
updatalist(l, d, e);
printlist(l);
}
Node* initlist(int n) {
//头节点
Node* l = (Node*)malloc(sizeof(Node));
//下面使用尾插法进行插入操作;
Node* r;
r = l;
l->next = NULL;
for (int i = 0; i < n; i++)
{
int input;
printf("请输入第%d个元素的数字\n", i+1);
scanf("%d", &input);
Node* a = (Node*)malloc(sizeof(Node));
a->data = input;
//首先让a节点对应下一节点为null
a->next = NULL;
//尾指针的next指向a,这里就是将头节点和a连接起来了
r->next = a;
//尾指针重新指向a,方便尾插
r = a;
//头插法,最后出来的结果是逆序
/*a->next = l->next;
l->next = a;*/
}
return l;
}
void printlist(Node* l) {
Node* p;
p = l->next;
while (p != NULL) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
//接下来是一个插入的操作,需要的参数是链表,插入位置,插入的数据,返回一个int的类型表示完成操作
int insertlist(Node* l, int a, int b) {
Node* p;
Node* s = (Node*)malloc(sizeof(Node));
s->data = b;
p = l;
for (int i = 1; i < a; i++)
{
//头指针指向的是空的节点,并不是null,null就是空。
if(p==NULL)
{
printf("插入位置无效\n");
return 0;
}
p = p->next;
}
s->next = p->next;
p->next = s;
return 0;
}
//接下来做的是删除的操作,需要的参数是链表,删除的数据的位置(后续看想不想改成删除的数据),删除后翻译一个int类型表示完成
int deletelist(Node* l, int a) {
Node* temp = l;
for (int i = 1; i < a; i++)
{
if (temp == NULL) {
printf("超出位置范围不提供搜索");
return 0;
}
temp = temp->next;
}
Node* q = (Node*)malloc(sizeof(Node));
q = temp->next;
temp->next = temp->next->next;
free(q);
return 0;
}
//接下来进行修改的操作,需要参数链表,修改的位置,修改的数据
int updatalist(Node* l, int a, int b) {
Node* p = l;
for (int i = 0; i < a; i++)
{
if (p == NULL) {
printf("超出链表长度");
}
p = p->next;
}
p->data = b;
return 0;
}
要注意,指向头结点的指针并不代表指针等于NULL;这点没搞清楚在写的时候出现过问题。