链表集锦

来源:互联网 发布:vggnet 网络结构 编辑:程序博客网 时间:2024/06/05 00:53
/* LNode表示该结构类,是该结构的一个实例LinkList是该结构类的指针,指代的是一个实例的地址他们的区别在于访问其成员不一样:LNode.dataLinkList->data举个通俗的例子:人小明站在河边。LNode相当于小明LinkList相当于 在河边的那个人当 LinkList=&LNode 时候就表示小明在河边 */typedef struct LNode{ElemType data;struct LNode  *next;}LNode,*LinkList;//////////////////////////////////////////////////////////////////////////单向链表,3个文件//LinkList.h#ifndef LINKLIST_H#define LINKLIST_H#define INFINITY 65535typedef int ElemType;typedef struct node{ElemType data;struct node *next;}LinkNode, *LinkList;void InitList(LinkList *l); //初始化单链表  void InsertList(LinkList l, int i, ElemType e); //在单链表的第i个位置插入元素e  void DeleteList(LinkList l, int i);//删除单链表的第i个位置的元素,把删除的元素存入*evoid GetElem(LinkList l, int i);//返回链表中第i个位置的元素void Print(LinkList l);void Push_front(LinkList l,ElemType e); //倒序插入元素  void Push_back(LinkList l,ElemType e); //正序插入元素void DestroyList(LinkList l);#endif///////////////////////////////method.cpp 具体方法实现#include "stdafx.h"#include "LinkList.h"#include <stdio.h>#include <stdlib.h>void InitList(LinkList *l) //初始化链表{(*l) = (LinkList)malloc(sizeof(LinkNode));(*l)->next = NULL;}void InsertList(LinkList l, int i, ElemType e) //在链表的第i个位置插入元素e  {LinkList p = l->next;int j = 1;while (p && j<i-1) //使p成为要插入位置的前一个结点  {p = p->next;++j;}if (!p){printf("超出范围插入失败\n");return;}else{LinkList temp = (LinkList)malloc(sizeof(LinkNode));temp->data = e;temp->next = p->next; //使新结点的指针域指向p的指针域所指向的位置  p->next = temp; //使p的指针域指向新结点}}void DeleteList(LinkList l, int i) //删除第i个位置的结点,将结点的数据赋值给*e  {LinkList p = l->next;int j = 1;while (p && j<i-1) //移动到要删除的结点的前一个结点  {p = p->next;++j;}if (p){LinkList temp = p->next; //使temp指向要删除结点p->next = temp->next; //使p->next指向要删除的结点的下一个结点free(temp);}}void GetElem(LinkList l, int i) //将第i个元素的位置存入*e  {LinkList temp = l->next;int j = 1;while (temp && j<i){temp = temp->next;++j;}if (temp){printf("%d\n",temp->data);}else{printf("没有找到\n");}}void Print(LinkList l) //打印链表{LinkList p = l->next;while (p){printf("%d ",p->data);p = p->next;}printf("\n");}void Push_front(LinkList l, ElemType e) //倒序插入元素  {LinkList temp = (LinkList)malloc(sizeof(LinkNode));temp->data = e; temp->next = l->next; //新结点的指针域指向头结点所指向的结点  l->next = temp; //头结点指向新结点 }void Push_back(LinkList l, ElemType e) //正序插入元素 {static LinkList order = l;LinkList temp = (LinkList)malloc(sizeof(LinkNode));temp->data = e;temp->next = order->next; //temp保存上一个指针域order->next = temp;      //上下两个指针链接起来,此时temp->next保存order->next,原来order指向哪里就哪里order = order->next; //使order一直指向最后一个结点 ,如果原来order指向第1个结构体,order = order->next执行后已经指向第2个结构体}void DestroyList(LinkList l) //清空链表 {while (l){LinkList temp = l;l = l->next;free(temp);}}///////////////////////////main.cpp 测试#include "stdafx.h"#include "LinkList.h"#include <stdio.h>int main(void){LinkList l;InitList(&l);int i;for (i = 1; i<20; i+=2){Push_back(l, i);}printf("链表的元素为:\n");Print(l);printf("在第11个位置插入元素:22,插入后的链表元素为:\n");  InsertList(l, 11, 22);Print(l);printf("在第5个位置删除元素后的链表为:\n");  DeleteList(l, 5);Print(l);printf("链表第7个位置的元素为: ");  GetElem(l, 7);DestroyList(l);return 0;}/////////////////////////////////////////////////////////////////////////////////////////////双向链表,3个文件//LinkList.htypedef int ElemType;typedef struct node{ElemType data;struct node *next; //链表的指针域,指向后继  struct node *prev; //链表的指针域,指向前驱}LinkNode, *LinkList;void InitList(LinkList *l); //初始化链表 void CreateList(LinkList l); //创建一个双向链表 void InsertList(LinkList l, int i, ElemType e); //在双向链表的第i个位置插入元素  void DeleteList(LinkList l, int i); //删除双向链表的第i个位置的元素  void DestroyList(LinkList l); //销毁双向链表 void Print(LinkList l);int GetLinkLength(LinkList l);///////////////////////////////////////method.cpp#include "stdafx.h"#include "LinkList.h"#include <stdio.h>#include <stdlib.h>void InitList(LinkList *l){(*l) = (LinkList)malloc(sizeof(LinkNode));(*l)->next = (*l)->prev = NULL;}void CreateList(LinkList l){LinkList order = l;printf("请输入双向链表的数据:\n");  int data;while ((scanf("%d",&data)) != EOF){LinkList temp = (LinkList)malloc(sizeof(LinkNode));if (temp) //如果内存分配成功  {temp->data = data;temp->next = order->next; //使新结点的指针域指向当前结点所指向的结点  if (order == l) //如果temp是第一个结点,则他的指向前驱的指针是NULL  {temp->prev = NULL;}else{temp->prev = order; //否则就指向当前的结点 }order->next = temp; //当前结点的后继指针域指向新结点order = order->next; //指向当前结点的指针指向新结点}}}int GetListLength(LinkList l){int i = 0;LinkList temp = l->next;while (temp){temp = temp->next;i++;}return i;}void InsertList(LinkList l, int i, ElemType e){if (i < 1 || i > GetListLength(l) + 1){return;}LinkList temp = l;int j;for (j = 0; j < i - 1; ++j)  //循环到要插入的位置的前一个位置  {temp = temp->next;}LinkList tp = (LinkList)malloc(sizeof(LinkNode));if (tp){tp->data = e; //初始化新结点的数据 tp->next = temp->next; //初始化新结点的后继指针域 temp->next->prev = tp; //使当前结点的后继结点的前驱指针域指向新结点  temp->next = tp; //当前结点指向的后继指针域指向新结点 tp->prev = temp; //新结点的后继指针域指向当前结点 }}void DeleteList(LinkList l, int i){if(i < 1 || i > GetListLength(l)) //超出范围返回  {return;}LinkList temp = l;int j;for (j = 0; j < i; ++j){temp = temp->next;}temp->prev->next = temp->next; //使要删除结点的前驱的后继指针指向要删除的结点的后继结点  temp->next->prev = temp->prev; //使要删除结点的后继结点的前驱指针指向要删除结点的后继结点  free(temp);}void DestroyList(LinkList l){LinkList temp = l->next;while (temp){LinkList tp = temp;temp = temp->next;free(tp);}free(l);}void Print(LinkList l){LinkList temp = l->next;while (temp){printf("%d ",temp->data);  temp = temp->next;}printf("\n");}////////////////////main.cpp#include "stdafx.h"#include "LinkList.h"#include <stdio.h>int main(){LinkList l;InitList(&l);CreateList(l);Print(l);printf("在链表的第2个位置插入元素:5\n");InsertList(l,2,5);Print(l);printf("删除链表的第3个位置的元素:\n");DeleteList(l,3);Print(l);DestroyList(l);return 0;}/////////////////////////////////////////////////////////////////////////////////////////单链表#include <stdio.h>#include <stdlib.h>typedef struct node{    int data;    struct node *next;}node;/*int init_linklist(node **head){    if (NULL == head)    {        return -1;    }    *head = (node *)malloc(sizeof(node));    if (NULL == *head)    {        return -1;    }    (*head)->next = NULL;        return 0;}*//*int insert_linklist(node **head, int i, int data){    if (NULL == head)    {        return -1;    }    int j = 0;    node *p = *head;    while (p && (j < i))    {        j++;        p++;    }    if ((NULL == p) || (j > i - 1))     {        return -1;    }    node *s = (node *)malloc(sizeof(node));    if (NULL == s)    {        return -1;    }    s->data = data;    s->next = p->next;    p->next = s;    return 0;}*//*int length_linklist(node *head){    if (NULL == head)    {        return -1;    }    int count = 0;    node *p = head->next;    while (p)    {        count++;        p = p->next;    }    return count;}*/void output_linklist(node *head){    if (NULL == head)    {        return;    }    node *p = head->next;    while (p)    {        printf("%d ", p->data);        p = p->next;    }    return;}int delete_linklist(node **head, int i){    if (NULL == head)    {        return -1;    }    int j = 0;    node *p = (*head)->next;    node *q = NULL;    while (p &&(j < i - 1))    {        p = p->next;        j++;    }    if ((NULL == p) || (j > i - 1))    {        return -1;    }    q = p->next;    if (NULL == q)    {        return -1;    }    p->next = q->next;    free(q);    return 0;}int remove_linklist(node **head, int data){    if (NULL == head)    {        return -1;    }    node *p = (*head)->next;    node *q = NULL;    while (p && (p->data != data))    {        p = p->next;    }    if (NULL == p)    {        return -1;    }    q = p->next;    p->next = q->next;    free(p);    return 0;}int destory_linklist(node **head){    if ((NULL == head) || (NULL == *head))    {        return -1;    }    clear_linklist(head);    if (*head)    {        free(head);        head = NULL;    }    return 0;}int clear_linklist(node *head){    if (NULL == head)    {        return -1;    }    node *p = head->next;    node *q = NULL;    while (p)    {        q = p->next;        free(p);        p = q;    }    return 0;}int main(void){    node *La = NULL; /*   if(init_linklist(&La) < 0)    {        printf("init error\n");        return -1;    }*/    int i;    for(i = 0; i<5 ;i++)    {        if(insert_linklist(&La,i+1,i+1) < 0)        {            printf("insert error\n");            return -1;        }    }        printf("LinkLength: %d\n",length_linklist(La));        output_linklist(La);    if(destory_linklist(&La) < 0)    {        return -1;    }    return 0;}////////////////////////////////////////////////////////////////////////////////////////////4、递升链表合并#include <stdio.h>#include <stdlib.h>#define MAXLENGTH 5struct Data {    int data;    struct Data *next;};struct Data *list_merge(struct Data *list_a, struct Data *list_b, struct Data *result);int main(){    typedef struct Data Data;    Data *head_a, *head_b;    Data *now_a, *now_b;    Data *curr;    head_a = (Data *)malloc(sizeof(Data));    head_a -> data = 1;    now_a = head_a;    head_b = (Data *)malloc(sizeof(Data));    head_b -> data = 2;    now_b = head_b;    int i;    for (i = 1; i < MAXLENGTH; i++){        curr = (Data *)malloc(sizeof(Data));        curr->data = i*2 + 1;        curr->next = NULL;        now_a -> next = curr;        now_a = curr;    }    for (i = 1; i < MAXLENGTH + 2; i++){        curr = (Data *)malloc(sizeof(Data));        curr -> data = i * 2 + 2;        curr -> next = NULL;        now_b -> next = curr;        now_b = curr;    }    printf("List A: ");    now_a = head_a;    while (now_a != NULL){        printf("%d", now_a -> data);        if (now_a -> next != NULL)            printf(" -> ");        now_a = now_a -> next;    }    printf("\n");    printf("List B: ");    now_b = head_b;    while (now_b != NULL){        printf("%d", now_b -> data);        if (now_b -> next != NULL)            printf(" -> ");        now_b = now_b -> next;    }    printf("\n");    printf("After merge: ");    Data *result = NULL;    result = list_merge(head_a, head_b, result);    while (result) {        printf("%d", result -> data);        if (result -> next != NULL){            printf(" -> ");        }        result = result -> next;    }    printf("\n");    return 0;}struct Data *list_merge(struct Data *list_a, struct Data *list_b, struct Data *result){    struct Data *pa, *pb, *pc;    pa = list_a;    pb = list_b;    if (pa != NULL && pb != NULL && pa -> data <= pb -> data){        result = pa;        pc = pa;        pa = pa -> next;    }else if (pa != NULL && pb != NULL) {        result = pb;        pc = pb;        pb = pb -> next;    }    while (pa && pb){        if (pa -> data <= pb -> data){            pc -> next = pa;            pc = pa;            pa = pa -> next;        }else{            pc -> next = pb;            pc = pb;            pb = pb -> next;        }    }    pc -> next = pb == NULL ? pa : pb;    pc = result;    return pc;}//////////////////////////////////////////////////////////////////////////////////////链表c++#include <iostream>using namespace std;typedef struct LNODE{int    iData;LNODE *pNext;}*SLINK;LNODE *pPtr, *pTemp;SLINK CreateList_S(int iArr[], int iNum){int iCnti;SLINK L = new LNODE;if (!L){exit(1);}L->pNext = NULL;LNODE *pTail = L;for (iCnti = 0; iCnti < iNum; iCnti++){pPtr = new LNODE;if (!pPtr){exit(1);}pPtr->iData = iArr[iCnti];pTail->pNext = pPtr;pTail = pPtr;}    pTail->pNext = NULL;    return L;}SLINK CreateList_R(int iArr[], int iNum){int iCnti;SLINK L = new LNODE;if (!L){exit(1);}L->pNext = NULL;for (iCnti = iNum; iCnti > 0; --iCnti){pPtr = new LNODE;if (!pPtr){exit(1);}pPtr->iData = iArr[iCnti-1];pPtr->pNext = L->pNext;L->pNext = pPtr;}return L;}bool InsertList(SLINK &L, int iPoint, const int iData){int iCntj = 0;pPtr = L;while (pPtr && (iCntj < iPoint-1)){pPtr = pPtr->pNext;iCntj++;}if (!pPtr || (iCntj > iPoint - 1)){return false;}pTemp = new LNODE;if (!pTemp){exit(1);}pTemp->iData = iData;pTemp->pNext = pPtr->pNext;pPtr->pNext = pTemp;return true;}void PrintList(const SLINK &L){pPtr = L->pNext;while (pPtr){cout<<pPtr->iData <<" ";pPtr = pPtr->pNext;}cout<<endl;return;}bool DeleteList(SLINK &L, int iPoint){int iCntj = 0;pPtr = L;while (pPtr->pNext && (iCntj < iPoint -1)){pPtr = pPtr->pNext;iCntj++;}if (!pPtr || (iCntj > iPoint-1)){return false;}pTemp = pPtr->pNext;pPtr->pNext = pTemp->pNext;delete pTemp;return true;}int main(void){int iArr[] = {1, 3, 4, 2, 5};SLINK head1 = CreateList_S(iArr, 5);    PrintList(head1);SLINK head2 = CreateList_R(iArr, 5);    PrintList(head2);InsertList(head2, 6, 8);PrintList(head2);DeleteList(head2, 2);PrintList(head2);return 0;}//////////////////////////////////////////////////////////////////////////////////////循环链表,解决约瑟夫问题#include <stdio.h>#include <stdlib.h>#define MAX_NUM 5typedef struct NODE{int iData;struct NODE *pNext;}NODE_S;/* 创建循环链表 */NODE_S *CreateList(int iNum){int iCnti;NODE_S *pHead = NULL;NODE_S *ptail = NULL;NODE_S *pPtr = NULL;for (iCnti = 0; iCnti < iNum; iCnti++){pPtr = (NODE_S *)malloc(sizeof(NODE));if (NULL == pPtr){exit(1);}pPtr->iData = iCnti;if (NULL == pHead){pHead = pPtr;}else{ptail->pNext = pPtr;}ptail = pPtr;}pPtr->pNext = pHead;return(pHead);}//约瑟夫问题void Josephus(NODE_S *pHead, int iStart){int iCnti;NODE_S *pPtr = pHead;NODE_S *pTail;/* 寻找第一个报数点的位置 */for (iCnti = 0; iCnti < iStart; iCnti++){pTail = pPtr;pPtr = pPtr->pNext;} /* 此时p指向第1个出发点 *//* 一直循环直到链表中只剩下一个链接点   */while (pPtr->pNext != pPtr){for (iCnti = 1; iCnti < MAX_NUM; iCnti++){pTail = pPtr;pPtr = pPtr->pNext;} /* 此时p指向第m个结点,r指向第m-1个结点  */pTail->pNext = pPtr->pNext;printf( "%d ", pPtr->iData);    /* 输出一个结点编号 */free(pPtr);pPtr = pTail->pNext;}printf( "%d\n", pPtr->iData);  /* 输出最后那个结点的编号 */return;}void PrintList(NODE_S *pHead){NODE_S *pPtr = pHead;while (pPtr->pNext != pHead){printf("%d ", pPtr->iData);pPtr = pPtr->pNext;}printf("%d ", pPtr->iData);return;}int main(void){int iStart = 3;NODE_S *pHead;pHead = CreateList(MAX_NUM);PrintList(pHead);printf("\n");    Josephus(pHead, iStart);return 0;}/////////////////////////////////////////////////////////////////////////////////双向链表(自己实现)#include <stdio.h>#include <stdlib.h>typedef struct NODE{int iData;struct NODE *pNext;struct NODE *pPrev;}NODE_S;void InitList(NODE_S **pHead){(*pHead) = (NODE_S *)malloc(sizeof(NODE_S));    (*pHead)->pNext = (*pHead)->pPrev = NULL;return;}void CreateList(NODE_S *pHead){int iData;NODE_S *pOrder = pHead;printf("请输入双向链表的数据:\n");  while(EOF != (scanf("%d", &iData))){NODE_S *pTemp = (NODE_S*)malloc(sizeof(NODE_S));if (pTemp) /* 如果内存分配成功 */{pTemp->iData = iData;pTemp->pNext = pOrder->pNext; /* 使新结点的指针域指向当前结点所指向的结点   */if (pOrder == pHead){pTemp->pPrev = NULL;} else{pTemp->pPrev = pOrder;}pOrder->pNext = pTemp;pOrder = pOrder->pNext;}}return;}int GetListLength(NODE_S *pHead){int iCnti = 0;NODE_S *pTemp = pHead->pNext;while (pTemp){pTemp = pTemp->pNext;iCnti++;}    return iCnti;}void InsertList(NODE_S *pHead, int iPoint, int iData){if ((iPoint < 1) || (iPoint > GetListLength(pHead) + 1)){return;}NODE_S *pPtr = pHead;int iCnti;for (iCnti = 0; iCnti < iPoint - 1; iCnti++){pPtr = pPtr->pNext;}NODE_S *pTemp = (NODE_S*)malloc(sizeof(NODE_S));if (pTemp){pTemp->iData = iData;pTemp->pNext = pPtr->pNext;pPtr->pNext->pPrev = pTemp;pPtr->pNext = pTemp;pTemp->pPrev = pPtr;}return;}void PrintList(NODE_S *pHead){NODE_S *pTemp = pHead->pNext;while (pTemp){printf("%d ", pTemp->iData);pTemp = pTemp->pNext;}printf("\n");return;}void DeleteList(NODE_S *pHead, int iPoint){if ((iPoint < 1) || (iPoint > GetListLength(pHead) + 1)){return;}NODE_S *pTemp = pHead;int iCnti;for (iCnti = 0; iCnti < iPoint; iCnti++){pTemp = pTemp->pNext;}     pTemp->pPrev->pNext = pTemp->pNext; pTemp->pNext->pPrev = pTemp->pPrev; free(pTemp); return;}void DestoryLst(NODE_S *pHead){NODE_S *pPtr = pHead->pNext;while (pPtr){NODE_S *pTemp = pPtr;pPtr = pPtr->pNext;free(pTemp);}return;}int main(void){NODE_S *pHead;InitList(&pHead);CreateList(pHead);PrintList(pHead);InsertList(pHead, 3, 100);PrintList(pHead);DeleteList(pHead, 2); /* 删除头结点会出问题 */PrintList(pHead);DestoryLst(pHead);return 0;}///////////////////////////////////////////////////////////////////////////////

原创粉丝点击