單鏈表的建立分爲頭插法和尾插法,頭插法是不斷地向頭結點插入新的結點。這樣會使你所插入的結點值呈現逆序,因此頭插法也能夠實現單鏈表的逆置。尾插法是不斷地向插入的新元素以後再插入新的元素。須要注意的是頭插法必須初始化頭結點,使得頭結點的指針域指向NULL,即p->next=NULL,詳細請看代碼:ios
#include <iostream> #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //單鏈表定義(結構體) typedef struct LNode{ int data;//數據域 struct LNode *next;//指針域 }LNode,*LinkList; //初始化單鏈表(不帶頭結點) /* bool InitList(LinkList &L){ L = NULL;//將單鏈表初始化爲空表 return true; } */ //初始化單鏈表(帶頭結點) bool InitList(LinkList &L){ L = (LNode *)malloc(sizeof(LNode));//分配一個頭結點,而且用L指針變量指向這個頭結點 if(L==NULL){ return false;//內存不足分配失敗 } L->next = NULL;//頭結點以後暫時尚未結點 return true; } //尾插法創建單鏈表 LinkList List_TailInsert(LinkList &L){ int x; LNode *s,*r = L;//聲明新結點和尾指針 scanf("%d",&x); while(x!=9999){ s = (LNode *)malloc(sizeof(LNode)); s->data = x; r->next = s;//將r結點與s結點鏈接 r = s;//尾指針指向s scanf("%d",&x); } r->next = NULL; return L; } //頭插法創建單鏈表 LinkList List_HeadInsert(LinkList &L){ int x; LNode *s; scanf("%d",&x); while(x!=9999){ s = (LNode *)malloc(sizeof(LNode)); s->data = x;//與後插操做相似,與後插不一樣的是每次在頭結點插入 s->next = L->next; L->next = s; scanf("%d",&x); } return L; } /* LNode *p = (LNode*)malloc(sizeof(LNode));//爲結點申請內存空間,而且用指針p指向起始地址 */ //查找第i個結點(帶頭節點p指向第一個節點,不是頭結點) /* LNode * GetElem(LinkList L,int i){ int j = 1; LNode *p = L->next; if(i==0){ return L; } if(i<1){ return NULL; } while(p!=NULL&&j<i){ p = p->next; j++; } return p; } */ //按位查找(帶頭節點) LNode *GetElem(LinkList L,int i){ if(i<1){ return NULL; } LNode *p = (LNode *)malloc(sizeof(LNode)); int j=0; p = L; while(p!=NULL&&j<i){ p = p->next; j++; } return p; } //按值查找(帶頭節點) LNode *LocateElem(LinkList L,int e){ LNode *p = (LNode *)malloc(sizeof(LNode)); p = L->next;//使指針p指向第一個結點 while(p!=NULL && p->data!=e){ p = p->next; } return p;//找到返回結點指針,不然返回NULL } //求單鏈表的長度 int length(LinkList L){ int len = 0; // LNode *p = (LNode *)malloc(sizeof(LNode)); LNode *p = L; while(p->next!=NULL){ p = p->next; len++; } return len; } //按位序插入單鏈表(帶頭節點) bool ListInsert(LinkList &L,int i,int e){ if(i<1){ return false; } //GetElem(L,i-1); LNode *p;//指向當前表結點的指針 int j = 0;//當前p指向的是第幾個結點 p = L;//L指向頭結點,p也指向頭結點.頭結點不存任何數據 if(p!=NULL&&j<i-1){ p = p->next; j++; } if(p==NULL){//i值不合法(可能超出單鏈表的長度) return false; } LNode *s = (LNode*)malloc(sizeof(LNode)); s->data = e;//將結點的值存入s結點中 s->next = p->next;//將s結點鏈接到p的下一個結點上 p->next = s;//將p結點鏈接到s結點上 (上下兩句位置不可換) //return InsertNextNode(p,e); } //指定結點後插操做 bool InsertNextNode(LNode *p,int e){ if(p==NULL){//當前p指針指向的結點正常指向下一個結點 return false; } LNode *s = (LNode *)malloc(sizeof(LNode)); if(s==NULL){//內存不足 return false; } s->data = e;//存放數據 s->next = p->next; p->next = s;//將s鏈接 return true; } //指定結點前插操做 bool InsertPriorNode(LNode *p,int e){ if(p==NULL){ return false; } LNode *s = (LNode *)malloc(sizeof(LNode)); if(s==NULL){ return false; } s->next = p->next;//鏈接結點 p->next = s; s->data = p->data;//交換數據 p->data = e; } //按位序刪除單鏈表(帶頭節點) bool ListInsert(LinkList &L,int i,int &e){ if(i<1){ return false; } //GetElem(L,i-1); LNode *p;//指向當前表結點的指針 int j = 0;//當前p指向的是第幾個結點 p = L;//L指向頭結點,p也指向頭結點.頭結點不存任何數據 if(p!=NULL&&j<i-1){ p = p->next; j++; } if(p==NULL){//i值不合法(可能超出單鏈表的長度) return false; } if(p->next==NULL){//i-1結點後無結點 return false; } LNode *q = p->next;//q指向將要刪除的結點 e = q->data;//用e返回刪除的元素值 p->next = q->next;//把p與刪除後的下一個結點鏈接 free(q);//釋放q結點的內存空間 return true; } //輸出函數 void p(LinkList L){ LNode *g; g = L->next; while(g!=NULL){ printf("%d\t",g->data); g = g->next; } } int main(int argc, char** argv) { LinkList L;//聲明單鏈表 InitList(L);//初始化單鏈表 List_TailInsert(L);//尾插法 p(L); printf("\n"); List_HeadInsert(L);//頭插法 // int l = length(L); // printf("%d\n",l); // for(int i=1;i<=l;i++){ // LNode *g = GetElem(L,i); // printf("%d\t",g->data); // } p(L); return 0; }