#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct Node { ElemType data; struct Node * next; }Node,* Linklist; //采用循环链表来储存数据 void InitList(Linklist L) { L=(Linklist)malloc(sizeof(Node)); L->next=L; } //建立链表 void CreatFromTail(Linklist L) { Node * rear,* s; int n; rear=L; scanf("%d",&n); while(n!=0) { s=(Node *)malloc(sizeof(Node)); s->data=n; rear->next=s; rear=s; scanf("%d",&n); } rear->next=L; } //尾插法建表 void OutList(Linklist L) { Node * p; p=L->next; if(p==NULL) { printf("链表为空"); } while(p->data)//值不为空时输出 { printf("%d ",p->data); p=p->next; } } //输出循环链表 void DelList(Linklist L,ElemType * e,int i) { Node * pre,*r; int k; if(i<=0) printf("ERROR"); pre=L;k=0; while(pre!=NULL&&k<i-1) { pre=pre->next; k=k+1; } if(pre->next==NULL) { printf("删除位置不合法"); } r=pre->next; pre->next=r->next; * e=r->data; free (r); } //删除结点函数 int main() { Linklist L; InitList(L); CreatFromTail(L); OutList(L); int m=4; ElemType * e=0; DelList(L,e,m); OutList(L); return 0; }
时间: 2023-12-09 22:03:20 浏览: 43
这段代码存在一些问题:
1.在InitList函数中,应该传入Linklist *L的指针,否则无法修改传入的指针。
2.在CreatFromTail函数中,链表的尾节点应该指向头节点L,而不是直接将rear指向L。
3.在OutList函数中,判断链表为空的条件应该是L->next == L,而不是L->next == NULL。
4.在DelList函数中,应该判断i的合法性,如果i<=0或i超过链表长度,则应该输出错误信息。
5.在DelList函数中,如果删除的是最后一个节点,需要将尾节点rear指向删除节点的前一个节点pre。
6.在main函数中,指向ElemType类型的指针e没有分配空间,应该先分配空间再调用DelList函数。
下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
} Node, *Linklist;
void InitList(Linklist *L) {
*L = (Linklist)malloc(sizeof(Node));
(*L)->next = *L;
}
void CreatFromTail(Linklist L) {
Node *rear = L, *s;
int n;
scanf("%d", &n);
while (n != 0) {
s = (Node *)malloc(sizeof(Node));
s->data = n;
rear->next = s;
rear = s;
scanf("%d", &n);
}
rear->next = L;
}
void OutList(Linklist L) {
Node *p = L->next;
if (p == L) {
printf("链表为空");
return;
}
while (p != L) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void DelList(Linklist L, ElemType *e, int i) {
if (i <= 0) {
printf("删除位置不合法");
return;
}
Node *pre = L, *r;
int k = 0;
while (pre->next != L && k < i - 1) {
pre = pre->next;
k++;
}
if (pre->next == L) {
printf("删除位置不合法");
return;
}
r = pre->next;
pre->next = r->next;
if (r == L) {
L = pre;
}
*e = r->data;
free(r);
}
int main() {
Linklist L;
InitList(&L);
CreatFromTail(L);
OutList(L);
int m = 4;
ElemType *e = (ElemType *)malloc(sizeof(ElemType));
DelList(L, e, m);
OutList(L);
return 0;
}
```
相关推荐
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)