链表------创建删除增加遍历

来源:互联网 发布:央视市场研究 知乎 编辑:程序博客网 时间:2024/05/22 06:12

LINKED LIST

创建链表

#include <stdio.h>#include<stdlib.h>#include<time.h>struct ListNode{    int data;    ListNode *next;};void CreateListHead(ListNode **head, int n){    ListNode *p;    ListNode *q;    srand(time(0)); //初始化随机种子    *head = (ListNode *)malloc(sizeof(ListNode));    q = *head;    for(int i = 0; i < n; i++){        p = (ListNode *)malloc(sizeof(ListNode));        p->data = rand()%100+1;        q->next = p;        q = p;    }    p->next = NULL;}

遍历整个表

void PrintfList(ListNode **head){    ListNode *p;    p = *head;    while(p = p->next){        printf("%d  ",p->data);    }}

删除整个表

bool ClearList(ListNode **head){    ListNode *p;    ListNode *q;    p = (*head)->next;    while(p){        q = p->next;        free(p);        p = q;    }    (*head)->next = NULL;    return 1;}

插入一个结点

void ListInsert(ListNode **head, int i, int a){    int j = 1;    ListNode *p;    ListNode *q;    p = (*head);    while(p && (j < i)){        j++;        p = p->next;    }    q = (ListNode *)malloc(sizeof(ListNode));    q->data = a;    q->next = p->next;    p->next = q;}

删除一个结点

void ListDelete(ListNode **head, int i){    int j = 1;    ListNode *p;    ListNode *q;    p = (*head);    while(p && (j < i)){        j++;        p = p->next;    }    q = p->next;    p->next = q->next;    free(q);}
int main(){    int n = 9;    int i = 4;    int a = 99;    ListNode *listNode;    CreateList(&listNode ,n);    PrintfList(&listNode);    ListInsert(&listNode, i, a);    printf("\n");    PrintfList(&listNode);    ListDelete(&listNode,i);    printf("\n");    PrintfList(&listNode);    //if(ClearList(&listNode))    //  printf("\n OK! \n");    return 0;}

循环列表就是把单链表结尾指向空指针改为指向头结点。
双向链表在单链表的没个节点中,在设置一个指向其前驱结点的指针域

0 0
原创粉丝点击