我正在用C构建一个程序,我希望将0-20中的100个随机值插入到链表中。之后,我希望将这些值推入堆栈,其顺序与插入列表中的顺序相同。谁能指点我怎么做?
我的代码:
#include <stdio.h>
#include <stdlib.h>
struct listNode{
int data;
struct listNode * nextPtr;
};
struct stackNode {
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef StackNode* StackNodePtr;
typedef struct listNode ListNode;
typedef ListNode * ListNodePtr;
void push(StackNodePtr *topPtr, int info);
void printStack(StackNodePtr currentPtr);
void insert(ListNodePtr *, int);
void printList(ListNodePtr);
int main(void)
{
ListNodePtr startPtr=NULL;
ListNodePtr startPtr1=NULL;
StackNodePtr stackPtr = NULL;
int item, i;
for(i=0;i<100;i++)
{
item = rand() % 20;
insert(&startPtr,item);
}
printList(startPtr);
while(startPtr){
push(&stackPtr,startPtr->data);
startPtr=startPtr->nextPtr;
}
printStack(stackPtr);
system("PAUSE");
return 0;
}
void insert(ListNodePtr *sPtr,int value)
{
ListNodePtr newPtr,previousPtr,currentPtr;
newPtr = (ListNodePtr)malloc(sizeof(ListNode));
if(newPtr!=NULL){
newPtr->data=value;
newPtr->nextPtr=NULL;
previousPtr=NULL;
currentPtr=*sPtr;
while(currentPtr!=NULL && value>currentPtr->data){
previousPtr=currentPtr;
currentPtr=currentPtr->nextPtr;
}
if(previousPtr==NULL){
newPtr->nextPtr=*sPtr;
*sPtr=newPtr;
}
else{
previousPtr->nextPtr=newPtr;
newPtr->nextPtr=currentPtr;
}
}
else
printf("%d not inserted! No memory!\n",value);
}
void printList(ListNodePtr c)
{
if(c==NULL){
printf("List is empty\n");
}else{
printf("The List is:\n");
while(c!=NULL){
printf("%d --> ",c->data);
c=c->nextPtr;
}
printf("NULL\n\n");
}
}
void push(StackNodePtr *topPtr, int info) {
StackNodePtr newPtr;
newPtr=malloc(sizeof(StackNode));
if(newPtr!=NULL) {
newPtr->data=info;
newPtr->nextPtr=*topPtr;
*topPtr=newPtr;
} else
printf("%d not inserted. No "
"memory.\n", info);
}
void printStack(StackNodePtr currentPtr) {
if (currentPtr == NULL) {
printf("Stack is empty.\n\n");
} else {
printf("The stack is:\n");
while (currentPtr != NULL) {
printf("%d --> ", currentPtr->data);
currentPtr = currentPtr->nextPtr;
}
printf("NULL\n\n");
}
}
我实际上是这样做的,现在无论整数插入到列表中,它都会插入到堆栈中,但顺序相反。
答案 0 :(得分:1)
在您的代码中,第二个循环插入在第一个循环的最后一次迭代中生成的整数(Item)。由于它保持不变,所有堆栈项都是相同的。将push语句放在第一个循环中就可以了。
int item, i;
for(i=0;i<100;i++)
{
item = rand() % 19;
insert(&startPtr,item);
}
for(i=0;i<100;i++)
{
push(&stackPtr, item);
}
这样做:
int item, i;
for(i=0;i<100;i++)
{
item = rand() % 19;
insert(&startPtr,item);
push(&stackPtr, item);
}
由于insert和Push导致列表和堆栈的顺序相反。你能做的是:
创建大小为100的数组。 使用100个随机值初始化数组(我希望我不需要为此提供代码) 然后,如果此数组的名称是randArray,请编写以下代码:
int item, i;
for(i=0;i<100;i++)
{
item = randArray[i];
insert(&startPtr,item);
item = randArray[99-i];
push(&stackPtr, item);
}
我正在做的是我将堆栈中的随机值以与列表相反的顺序插入。
初始化随机整数数组的代码:
srand(time(NULL));
int a[100] = {[0 ... 99] =1};
int i;
for (i=0; i<100; i++){
a[i]=rand()%19;
printf("%i \n",a[i]); // comment this line it is just for printing
}