将链接列表中的值插入堆栈

时间:2014-02-05 20:55:57

标签: c linked-list stack

我正在用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");
     }
}

我实际上是这样做的,现在无论整数插入到列表中,它都会插入到堆栈中,但顺序相反。

1 个答案:

答案 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
   }