一、 题目
题目描述
建立长度为n的单链表,在第i个结点之前插入数据元素data。
输入
第一行为自然数n,表示链式线性表的长度; 第二行为n个自然数表示链式线性表各元素值; 第三行为指定插入的位置i;第四行为待插入数据元素data。
输出
指定插入位置合法时候,输出插入元素后的链式线性表的所有元素,元素之间用一个空格隔开。输入不合法,输出"error!"。
样例输入
5
1 2 3 4 5
3
6
样例输出1 2 6 3 4 5
二、代码
#include<stdio.h>
#include<stdlib.h>
//单链表 带头结点
typedef struct LNode {
int data;
struct LNode *next;
} LNode,*Linklist;
//对链表进行初始化
bool Initlist(Linklist &L) {
L = (LNode*)malloc(sizeof(LNode)); //分配头结点
if (L==NULL) return false;
L-> next = NULL;
return true;
}
//插入操作
bool Insertlist(Linklist &L,int m,int e) {
if(m<1) return false; //插入点 不合法
int j = 0; //用来记录搜索到的位置
LNode* p = L;
while(p!=NULL && j<m-1) {
p = p->next;
j++;
}
if(p == NULL) return false; //插入位置为空,不合法
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
int main() {
int n = 0; //单链表长度
scanf("%d",&n);
Linklist L;
int b =0;
if(Initlist(L)) {
LNode* g = L;
for(int i =0; i<n; i++) {
scanf("%d",&b);
LNode* newnode = (LNode*)malloc(sizeof(LNode));
newnode->data = b;
newnode->next = NULL; //这行代码挺关键的,之前漏了这行代码,运行直接发生了内存泄露
g ->next = newnode;
g = g->next;
}
}
int m,e = 0;
scanf("%d",&m);
scanf("%d",&e);
if(Insertlist(L,m,e)) {
LNode* q = L;
for(int i =0; i<n+1; i++) {
if(q->next!=NULL) {
printf("%d ",q->next->data);
q = q->next;
}
}
} else printf("error!");
//释放内存
LNode* temp;
while (L->next != NULL) {
temp = L->next;
L->next = temp->next;
free(temp);
}
free(L);
return 0;
}
三、小tips
1.初始化、插入等操作的函数建议使用布尔类型,这样后续写代码的时候思路更清晰,而且更整洁
2.带头结点和不带头结点的区别:
1)初始化时代码不一样
2)插入、删除、遍历等操作时,不带头结点需要去判断链表是否为空,而带头结点则可以省去这一步。
3.内存泄漏问题:在完成所有操作之后别漏了free()释放内存~
4.Linklist L 与LNode* L的区别:本质上没区别,只是前者表示定义了一个头指针,后者更多的用在底层操作上面;
这可以使代码更清晰~
5.C中应该不支持引用操作(Linklist &L),但我写了没报错...不知道为啥(挠头)
若有纰漏,欢迎指正~~
标签:结点,LNode,int,952,next,Linklist,插入,SWUST,OJ From: https://blog.csdn.net/C1160793279/article/details/137149023