#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
typedef struct Node {
int val;
struct Node* next;
}Node, * ListNode;
ListNode LinkListInit();
bool createTail(ListNode L);
void printLinkList(ListNode L);
int getLen(ListNode L);
ListNode LinkListInit() {
Node* L;
L = (Node*)malloc(sizeof(Node)); //申请结点空间
if (L == NULL) { //判断是否有足够的内存空间
printf("申请内存空间失败\n");
}
L->next = NULL;//将next设置为NULL,初始长度为0的单链表
return L;
}
//输入一个链表的值
bool createTail(ListNode L) {
int x;
Node* s, * r = L;
printf("输入一个链表的值:\n");
scanf("%d", &x);
while (x != 9999) {
s = (Node*)malloc(sizeof(Node));
s->val = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return true;
}
//链表长度
int getLen(ListNode L) {
int len = 0;
ListNode R;
if (L->next == NULL)//头指针为空,则链表不包含元素,返回0
return 0;
else {
R = L->next;
while (R != NULL) {
R = R->next;
len++;
}
}
return len;
}
//按值查找结点值
int GetSize(ListNode L, int num) {
Node* p = L;
int j = 0;
while (p != NULL && p->val != num) {
p = p->next;
j++;
}
return j;
}
//按序号查找结点值
Node* GetElem(ListNode L, int i) {
int j = 1, temp;
Node* p = L->next;
if (i == 0)
return L;//若i = 0,则返回头结点
if (i < 1) {
return NULL;//若i无效,则返回NULL
}
while (p && j < i) {//查找到第i个结点
p = p->next;
j++;
}
return p;
}
//移除链表元素
ListNode removeElements(ListNode L, int val) {
ListNode p = NULL, q;
p = L;
if (p == NULL) {
return NULL;
}
while (p) {
if (p->val == val && p->next != NULL) {
q = p->next;
p->val = p->next->val;
p->next = q->next;
free(q);
}
else if (p->val == val && p->next == NULL) {
q = p->next;
p = q;
free(p);
//p->next = NULL;
}
else {
p = p->next;
}
}
return L;
}
//输出链表
void printLinkList(ListNode L)
{
ListNode p;
p = L->next;
if ( p== NULL) {
printf("null");
}
while (p)
{
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main(void) {
ListNode L1, L2,R,L;
int x;
L1 = LinkListInit();
L2 = LinkListInit();
L = LinkListInit();
R = LinkListInit();
createTail(L1);
printf("请输入要删除的数字:\n");
scanf("%d", &x);
R = removeElements(L1, x);
printLinkList(R);
return 0;
}
这是我的代码,在删除的时候总是删不掉尾节点,该如何处理呢?