user-0 提问: 为什么我的p3->data写出来是乱码，求解大佬，怎样修改，这是基于c语言的LRU算法基本程序。请大佬看下

回复:
user: user-1
content: 引用 6 楼 九华山小和尚 的回复:[quote=引用 5 楼 user-1的回复:][quote=引用 4 楼 九华山小和尚 的回复:] [quote=引用 2 楼 user-1的回复:]这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了[/quote]  等空了给你改改[/quote] 大佬你毕业了吗[/quote]  你家大佬操作系统原理考了100分…… 看了1小时，觉得你的算法好像不大对，*p1 - *p6看着脑壳疼。改程序太费时间了，所以重新写了供你参考 LRU用双链表实现算法看access（）函数~~没你弄得那么复杂~~  你是想做下图的算法对吧~~   上代码~~  #include <stdio.h> #include <stdlib.h> #define LEN 4  //最大页帧数 int count = 0; //缺页次数 typedef int Elemtype; typedef struct Node { 	Elemtype data; 	struct Node *next; 	struct Node *prior; }Node, Stack, *pStack;  int Init(pStack s);//初始化堆栈 void Print(const pStack s);//打印页表 int destroy(pStack s);//清空链表  Node * pick_PF(pStack s, const Elemtype e);//寻找页帧是否在栈中存在，存在：摘出并返回此页帧。 int push(pStack s, Node * n);//将页帧移至栈顶 int access(pStack s, const Elemtype e); //访问<<===LRU算法主要体现在这里。  int main() { 	int  ref_str[100], n = 0; //引用串、长度 	Stack S; 	Init(&S); //建立一个堆栈--用双向链表维护  	printf("输入引用串数字，用空格隔开，-1结束。例如：1 2 3 4 1 2 5 1 2 3 4 5 -1\n"); 	scanf("%d", &ref_str[n]); 	while (ref_str[n] > 0) { 		n++; 		scanf("%d", &ref_str[n]); 	} 	//按引用串依次访问 	for (int i = 0; i < n; i++) { 		access(&S, ref_str[i]);//<<===LRU算法主要体现在这里。 		printf("%d : 缺页 %d 次  ",i+1,count); 		Print(&S); 	}  	destroy(&S); 	return 0; }  //寻找页帧是否在栈中存在，存在：摘出并返回此页帧。 Node * pick_PF(pStack s, const Elemtype e) { 	pStack p = s; 	while (p->next != s) { 		p = p->next; 		if (p->data == e) { 			//摘出并返回 			p->prior->next = p->next; 			p->next->prior = p->prior; 			return p; 		} 	} 	return NULL; }  //将页帧压入栈顶 int push(pStack s, Node * n) { 	if (s == NULL || n == NULL) return 0; 	n->prior = s; 	n->next = s->next; 	s->next->prior = n; 	s->next = n; 	return 1; }  //访问 int access(pStack s, const Elemtype e) {  	Node* n; 	//如页帧存在，移至栈顶，返回。 	if (n = pick_PF(s, e)) { 		push(s, n); 		return 1; 	}  	//否则，缺页。 	if (s->data > 0) {//如有空间，产生新页帧 		n = (Node*)malloc(sizeof(Node)); 		s->data--; 	} 	else {//没有空间，换出栈底部的页帧，它是最久没被访问过的。 		n = pick_PF(s, s->prior->data); 	} 	n->data = e; 	push(s, n);//将其移至栈顶 	count++;  //缺页次数+1 	return 1; }  int del_node(pStack s, Elemtype e) { 	Node * p; 	if (p = pick_PF(s, e)) { 		free(p); 		s->data++; 	} 	return 1; } //清空链表 int destroy(pStack s) { 	Node *t, *p = s->next; 	while (p != s) { 		t = p->next; 		free(p); 		p = t; 	} 	s->next = s->prior = s; 	s->data = LEN; 	return 1; } //打印页表 void Print(pStack s) { 	pStack p = s; 	while (p->next != s) 	{ 		p = p->next; 		printf("| %3d |", p->data); 	} 	printf("\n"); } //初始化堆栈 int Init(pStack s) { 	if (s == NULL) 		return 0; 	s->next = s->prior = s; 	s->data = LEN; 	return 1; }

user: user-0
content: 引用 5 楼 user-1的回复:[quote=引用 4 楼 九华山小和尚 的回复:] [quote=引用 2 楼 user-1的回复:]这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了[/quote]  等空了给你改改[/quote] 大佬你毕业了吗

user: user-1
content: 引用 4 楼 九华山小和尚 的回复:[quote=引用 2 楼 user-1的回复:]这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了[/quote]  等空了给你改改

user: user-0
content: 引用 2 楼 user-1的回复:这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了

user: user-0
content: 引用 2 楼 user-1的回复:这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 我改出来了，好多小错误，不过还是改出来了，实在太菜了

user: user-1
content: 这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。

user: user-0
content: 大佬帮帮我