單連結串列學習

露水上的青蛙發表於2013-09-13

 

#include "stdafx.h"
#include "stdio.h"
#include <iostream>
using namespace std;

#define MAXSIZE 50
#define swap(a,b) a=a+b;b=a-b;a=a-b;
typedef struct Node{
 int data;
 struct Node *next;
}LNode;
void Output(Node *p);
void TailOutput(LNode *p);
// 頭插入法建連結串列
LNode* HeadList(LNode *head)
{
 int i;
 LNode *p,*h;
 h = head;
    for(i=0;i<5;i++)
 {
       p = (struct Node*)malloc(sizeof(struct Node));
       p->data = i;
    p->next = h->next;
    h->next = p;//新建立的節點,總是作為第一個節點
 }
 return head;
}
/*
  為了操作方便,總是在連結串列的第一個結點之前附設一個頭結點(頭指標)
  head指向第一個結點。頭結點的資料域可以不儲存任何資訊(或連結串列長度等資訊)
*/
//尾插入法建連結串列
LNode* TailList(LNode *Tail)
{
 LNode *p,*t;
 t = Tail;
 int i;
 for (i=0;i<10;i++)
 {
  p = (struct Node*)malloc(sizeof(struct Node));
  p->data = i;
  t->next = p;
  t = t->next;
 }
 t->next = NULL;
// free(p);
 return Tail;
}
/*
  向連結串列中插入一個節點(插入在末尾)
*/
LNode* insertNode(LNode *l,int value)
{
 LNode *p,*t;
 t=l;
 while(t->next!=NULL)
 {
  t=t->next;
 }
   
    p=(struct Node*)malloc(sizeof(struct Node));
    p->data=value;
 p->next=NULL;
 t->next=p;
 
 return l;
}
/*
  刪除某個節點的值
*/
LNode* DeleteNode(LNode *l,int value)
{
    LNode *p,*r;
 p=l;
    while(p!=NULL)
 {
  r=p->next;//p指向頭節點,而頭節點在定義時僅僅是一個節點,因此把頭節點的下一個節點(第一個節點)
  if (r->data==value)
  {
   p->next=r->next;
   return l;
  }
  p=p->next; 
 }
 return l;
}
/*
  查詢某個節點的值
*/
int SearchNode(LNode *l,int pos)
{
 LNode *p;
 int i=1;
 p=l;
 while (p->next!=NULL)
 {
  p=p->next;
  if (i==pos)
  {
   return p->data;
  }
        i++; 
 }
    return 0;
}
void Output(Node *p)
{
 Node *l;
 l = p->next;
 while(l!=NULL)
 {
  printf("%d\n",l->data);
  l = l->next;
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 LNode *tmp;
 Node *head,*p,*l;
 int t;
 head = (struct Node*)malloc(sizeof(struct Node));
 head->next = NULL;
   // tmp = HeadList(head);
 //Output(tmp);
 tmp = TailList(head);
 tmp = insertNode(tmp,5);
 tmp = DeleteNode(tmp,6);
 Output(tmp);
 t = SearchNode(tmp,3);
    printf("%d\n",t);
    getchar();
    
    return 0;
}

相關文章