//Linklist.h
typedef struct Node{
int data; //數據域
struct Node * next; //指針域
}ListNode , * Linklist; //ListNode 結點類型,Linklist 指向結點的指針類型
/*Linklist h; 定義頭指針*/ /*ListNode *p; 定義指向某結點的指針,兩者類型相同*/
單鏈表
1.初始化空表,建立頭結點
Linklist initll(){
Linklist h;
h = (Linklist)malloc(sizeof(ListNode));
if(h!=NULL)
h->next = NULL;
else
printf("分配空間失敗!\n");
return h;
}-
2.建立單鏈表
int Inpll(Linklist h,int n){ //形參:頭指針,結點個數ListNode *p,*tail; int i; tail = h; for(i=0;i<n;i++) { p=(ListNode * )malloc(sizeof(ListNode)); scanf("%d",&(p->data)); p->next = NULL; tail -> next = p; tail = p; //tail 永遠抓住最后一個結點 } return 1; }
-
3.往非遞減有序的單鏈表中插入一個結點后,鏈表仍有序
void Insll(Linklist h,int x){
ListNode p,q,*temp;q =(Linklist)malloc(sizeof(ListNode)); q->data=x; if(h->next==NULL) //原鏈表為空 { h->next=q; q->next=NULL; return; } for(p=h->next,temp=h;p!=NULL;temp=p,p=p->next) { if(p->data>=x){ q->next = p; //q的指針域指向當前結點 temp->next = q; //前一個結點的指針域指向q break; } else if(p->next==NULL) //x比原鏈表中所有結點的值都大,需把q放在最后 { p->next=q; q->next=NULL; break; } } }
-
4.遍歷單鏈表
int trall(Linklist h){
ListNode * p;if(h->next==NULL) //空表不遍歷 return 0; for(p=h->next;p!=NULL;p=p->next){ printf("%d\t",p->data); } printf("\n"); return 1; }
單循環鏈表
*** 特點:最后一個結點的指針域永遠指向頭結點 ***
-
1.建立帶頭結點的單循環鏈表
int ReInpll(Linklist h,int n){ ListNode *p,*tail; int i; /*h->next=NULL; //不帶頭結點創建單循環鏈表 scanf("%d",&(h->data));*/ tail = h; for(i=0;i<n;i++) { p=(ListNode * )malloc(sizeof(ListNode)); scanf("%d",&(p->data)); p->next = NULL; tail -> next = p; tail = p; //tail 永遠抓住最后一個結點 } p->next=h; //最后一個結點的指針域指向頭指針 return 1; }
-
2.刪除單循環鏈表中所有值為x的元素
void DelX_LL( Linklist h, int x){
ListNode p,q;
q=h;for(p=q->next;p!=h;p=q->next){ if(p->data==x){ q->next=p->next; free(p); //回收被刪除的結點 continue; //不再執行下面的語句 } q=q->next; } }
-
3.遍歷單循環鏈表
int traRell(Linklist h){ListNode * p; if(h->next == h) //空表不遍歷 return 0; for(p=h->next;p!=h;p=p->next){ printf("%d\t",p->data); } printf("\n"); return 1; }
單鏈表和單循環鏈表的區別
1.** 尾結點的指針域 **
單鏈表的尾結點的指針域指向NULL;
單循環鏈表的尾結點的指針域指向頭結點。2.** 判斷鏈表為空的條件 **
判斷單鏈表(帶頭結點)是否為空,是判斷頭結點的指針域是否為空。
if(head->next==NULL)
判斷單循環鏈表(帶頭結點)是否為空,是判斷頭結點的指針域是否指向自身。
if(h->next == head)
- 3.** 循環的條件 **
在算法中,
單鏈表的循環條件是:
p != NULL; //p結點不為空
或者
> p->next != NULL; //p結點的指針域不為空
單循環鏈表的循環條件是:
p != head; //p結點不等于頭指針