#include
#include
#include
typedef int datatype;
typedef struct node
{
datatype data;
int length;
struct node* next;
}linklist;
int main()
{
linklist* head;
head = (linklist*)malloc(sizeof(linklist));
assert(head);
int a, b;
linklist* p, * s, * l;
head->next = NULL;
s = NULL;
printf("请输入链表长度\n");
scanf_s("%d", &a);
printf("请输入数据\n");
for (int i = 0; i < a; i++)
{
scanf_s("%d", &b);
p = (linklist*)malloc(sizeof(linklist));
assert(p);
p->data = b;
if (head->next == NULL)
{
head->next = p;
p->next = NULL;
}
else
{
s->next = p;
}
s = p;
}
assert(s);
s->next = head->next;
printf("请输入你想删除第几个数的前趋结点\n");
int c;
scanf_s("%d", &c);
l = head;
for (int i = 1; i <= c; i++)
{
l = l->next;
}
free(head);
linklist* t;
t = l;
while (t->next != l)
{
t = t->next;
}
linklist* r;
r = t;
while (r->next != t)
{
r = r->next;
}
r->next = l;
free(t);
printf("链表为:\t");
linklist* w = r;
while (r->next != w)
{
printf("%-5d", r->data);
r = r->next;
}
printf("%-5d\n", r->data);
printf("\n");
}
为啥,头快秃了
修改如下,改动处见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int datatype;
typedef struct node
{
datatype data;
int length;
struct node* next;
}linklist;
int main()
{
linklist* head;
head = (linklist*)malloc(sizeof(linklist));
assert(head);
int a, b;
linklist* p, * s, * l;
head->next = NULL;
s = NULL;
printf("请输入链表长度\n");
scanf_s("%d", &a);
printf("请输入数据\n");
for (int i = 0; i < a; i++)
{
scanf_s("%d", &b);
p = (linklist*)malloc(sizeof(linklist));
assert(p);
p->data = b;
p->next = NULL; //修改
if (head->next == NULL)
{
head->next = p;
//p->next = NULL; 修改
}
else
{
s->next = p;
}
s = p;
}
//assert(s); 修改
//s->next = head->next; 修改
printf("请输入你想删除链表第几个位置的结点:\n"); //修改
int c;
scanf_s("%d", &c);
if (c > 0) {
l = head;
for (int i = 0; l->next && i < c - 1; i++) //for (int i = 1; i <= c; i++) 修改
{
l = l->next;
}
if (l->next) { //修改
linklist* t = NULL; //修改
t = l->next; //修改
l->next = t->next; //修改
free(t); //修改
}
//free(head);
}
//linklist* t; //修改
//t = l;
//while (t->next != l)
//{
// t = t->next;
//}
//linklist* r;
//r = t;
//while (r->next != t)
//{
// r = r->next;
//}
//r->next = l;
//free(t);
printf("链表为:\t");
linklist* r = head; //修改 linklist* w = r;
if (!r || !r->next) //修改
printf("NULL"); //修改
else { //修改
while (r->next != NULL) //修改 while (r->next != w)
{
printf("%-5d", r->next->data); //printf("%-5d", r->data); 修改
r = r->next;
}
}
//printf("%-5d\n", r->data); //修改
printf("\n");
}
在链表创建过程中,只是创建了头节点前面的节点,但是没有把链表的长度存储下来,所以后面的代码会出现问题。
在删除某个节点之前,应该检查该节点是否存在。
全部重新生成再看