C语言的循环链表问题
假设以带头点的循环链表表示队列,链表长度为n,只设一个指针指向队尾元素节点,不设头指针,试编写相应的队列初始化、入队和出队的算法;实现要求:
1、输入循环链表长度n;
2、入队m个元素;
3、打印队列中所有元素;
4、出队k个元素;
5、打印队列中的元素;
6、销毁队列。
输入:
8
6
1 2 3 4 5 6
3
输出:
1 2 3 4 5 6
4 5 6
我查了网上的一些代码,感觉都不合适,不能自由输入元素,我写不出来QAQ #include <stdio.h>
#include <stdlib.h>
#define DT char //可用int、unsigned、char
#define SDT " %c" //对应 "%d"、"%u"、" %c"
typedef struct _data {
DT x;
struct _data *next;
} DATA;
DATA* INPUT(int m);
void TEST(DATA *p);
DATA* DELLEN(DATA *p , int dellen);
int DELVAL(DATA *p , DT delval);
int main(int argc, char **argv){
DATA *now = NULL; //记录尾指针
int n , m , del ; //n最大长度、m数据长度、del删除的长度、val删除的值
DT val;
scanf("%d %d",&n,&m);
/*构建单向循环链表*/
if(n>=m){
now = INPUT(m);
TEST(now);
}
/*实现删除指定数目的数据*/
scanf("%d",&del);
now = DELLEN(now,del);
TEST(now);
/*实现删除指定值的数据*/
scanf(SDT,&val);
if(DELVAL(now,val)){
printf("del val ok!\n");
TEST(now);
}else{
printf("can't find the val!\n");
}
return 0;
}
DATA* INPUT(int m){
DATA *p , *head ;
if(m--){
head = (DATA*)malloc(sizeof(DATA));
head->next = head;
scanf(SDT,&head->x);
p = head;
}
while(m--){
p->next = (DATA*)malloc(sizeof(DATA));
p = p->next;
p->next = head;
scanf(SDT,&p->x);
}
return p;
}
DATA* DELLEN(DATA *p , int dellen){
DATA *q;
while(dellen--){
if(p->next == p){
p->next = NULL;
free(p);
p = NULL;
printf("error ! dellen > list \n");
break;
}
q = p->next;
p->next = p->next->next;
free(q);
}
(p != NULL)?(q = p):(q = p->next);
return q;
}
int DELVAL(DATA *p , DT delval){
DATA *pt = p;
int i;
do{
if(pt->next->x == delval){
p = pt->next;
pt->next = pt->next->next;
free(p);
p = NULL;
break;
}
pt = pt->next;
}while(pt != p);
(p == NULL)?(i=1):(i=0);
return i;
}
void TEST(DATA *p){
DATA *pt = p->next;
printf("head = %p , next = %p\n",p,p->next);
do{
printf("add = %p ",pt);
printf(SDT,pt->x);
printf(" next add = %p\n",pt->next);
pt = pt->next;
}while(pt != p->next);
printf("\n");
}
按照你说的思路做的,希望能帮你。 kin3z 发表于 2019-10-20 14:37
按照你说的思路做的,希望能帮你。
我拿到vs2019 编译不出来啊 有两个错误
kin3z 发表于 2019-10-20 14:37
按照你说的思路做的,希望能帮你。
您好,您的代码指针似乎没做好,指针未初始化,输出一部分乱码
页:
[1]