不带头结点的单链表各种操作,以函数的形式将各种功能展示出来了,读者可以根据函数功能在main函数里进行测试。
//不带头节点的操作 #include#include typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; void InitList(LinkList &L);//初始化单链表 int Length(LinkList L); bool Empty(LinkList L); void PrintList(LinkList L);//打印单链表 LinkList List_HeadInsert(LinkList &L);//头插法 LinkList List_TailInsert(LinkList &L);//尾插法 LNode* LocateElem_LNode(LinkList L,ElemType e);//按值查找结点1 int LocateElem(LinkList L,ElemType e);//得到该节点的位置 LNode* GetElem_LNode(LinkList L,int i);//按位查找结点2 ElemType GetElem(LinkList L,int i);//获取该节点的数据 bool ListInsert(LinkList &L,int i,ElemType e);//向表中插入数据 bool ListDelete(LinkList &L,int i,ElemType &e);//删除指定位置元素,并保存数据到e bool ClearList(LinkList &L);//清空表 int main() { LinkList L; LNode* p; ElemType e; InitList(L); } void InitList(LinkList &L) { L=NULL; } int Length(LinkList L) { int length=0; if(L==NULL)//首先判断第一个节点是否为空 { return length; } else { length++; } while (L->next!=NULL) { length++; L=L->next; } return length; } bool Empty(LinkList L) { if(L==NULL) { return true; } else { return false; } } void PrintList(LinkList L) { printf("表中数据为:"); if(L!=NULL) { printf("%d",L->data); while (L->next!=NULL) { L=L->next; printf("%d",L->data); } } printf("n"); } //1,4,3,2 //头节点位置固定不变,后面每次插入的数据都是插到头节点后面的那个位置 LinkList List_HeadInsert(LinkList &L) { InitList(L); LNode *s; ElemType e; printf("输入元素(9999停止)"); scanf("%d",&e); if(e!=9999) { L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; L->data=e; scanf("%d",&e); while (e!=9999) { s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=L->next; L->next=s; scanf("%d",&e); } } return L; } //从头节点开始依次往后面增加1,2,3,4,,,, LinkList List_TailInsert(LinkList &L) { InitList(L); LNode *s,*r; ElemType e; printf("输入元素(9999停止)"); scanf("%d",&e); if(e!=9999) { L=(LinkList)malloc(sizeof(LNode)); L->data=e; r=L; scanf("%d",&e); while (e!=9999) { s=(LNode*)malloc(sizeof(LNode)); s->data=e; r->next=s; r=s; scanf("%d",&e); } } r->next=NULL; return L; } //在表中查找第一个与查找元素相同的节点 LNode* LocateElem_LNode(LinkList L,ElemType e) { int j=1; LNode* p=L; if (p->data==e) { return p; } else { p=p->next; } while (p!=NULL&&p->data != e) { p=p->next; j++; } if (j==Length(L))//查找失败 { return NULL; } return p; } int LocateElem(LinkList L,ElemType e) { int j=1; LNode* p=L; if (p->data==e) { return j; } else { p=p->next; } while (p!=NULL&&p->data!=e) { p=p->next; j++; } if (j==Length(L))//查找失败 { return 0; } return j+1; } //获取表中指定位置的结点 LNode* GetElem_LNode(LinkList L,int i) { LNode *p=L; if (i<0||i>Length(L)) { return NULL; } for (int j = 1; j < i; j++) { p=p->next; } return p; } ElemType GetElem(LinkList L,int i) { LNode *p=L; if (i<0||i>Length(L)) { return NULL; } for (int j = 1; j < i; j++) { p=p->next; } return p->data; } bool ListInsert(LinkList &L,int i,ElemType e) { if (i<1||i>Length(L)+1) { return false; } LNode *s=(LNode*)malloc(sizeof(LNode)); s->data=e; if (i==1) { s->next=L; L=s; return true; } LNode *p=GetElem_LNode(L,i-1); s->next=p->next; p->next=s; return true; } bool ListDelete(LinkList &L,int i,ElemType &e) { if (i<1||i>Length(L)) { return false; } if(L==NULL) { return false; } LNode* p; LNode* q; if (i==1) { p=L; e=p->data; q=L->next; free(p); L=q; return true; } p=GetElem_LNode(L,i-1);//获取要删除结点的前一个结点 q=p->next; e=q->data; p->next=q->next; free(q); return true; } bool ClearList(LinkList &L) { if (L==NULL) { return false; } LNode *p; while (L->next!=NULL) { p=L->next; L->next=p->next; free(p); } L=NULL;//删除第一个结点 return true; }



