单链表的建立分为头插法和尾插法,头插法是不断地向头结点插入新的结点。这样会使你所插入的结点值呈现逆序,因此头插法也能够实现单链表的逆置。尾插法是不断地向插入的新元素以后再插入新的元素。须要注意的是头插法必须初始化头结点,使得头结点的指针域指向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; }