单链表 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

   

include<stdio.h>#include<stdlib.h>#define MaxSize 100#define INSERTER 10typedef struct Node{    int data;    struct Node *next;}SLNode ;void ListIntiate(SLNode **head)  //指针的指针{     *head = (SLNode *)malloc(MaxSize*sizeof(SLNode));    (*head)->next = NULL; // 记住括号不能少}int ListLength(SLNode *head)//返回结点的个数,不算头结点{        SLNode *p;        int size = -1;        p = head;        while (p!=NULL)        {            size++;            p = p->next;        }        return size;}//void ListInsert(SLNode *head, int x)//{//  SLNode *s;//  s = (SLNode *)malloc(sizeof(SLNode));//  s->data = x;//  s->next = head->next;//  head->next = s;//}void ListInsert(SLNode *head,int i,int x)//0<=i<=ListLength-2,相当数组的下标{    SLNode *s,*p=head;    int j = -1;    while (p->next!=NULL && j<i-1)    {        j++;        p = p->next;    }    if (j != i-1)    {        printf("参数i有问题!\n");    }    s = (SLNode *)malloc(sizeof(SLNode));    s->data = x;    s->next = p->next;    p->next = s;}void ListDelete(SLNode *head,int i,int *x)//0<=i<=ListLength,相当数组的下标{    SLNode *p,*q; int j = -1;    p = head;    while ( p->next != NULL &&  p->next->next != NULL && j<i-1 )    {        j++;        p = p->next;    }    if (j != i - 1)    {        printf("参数i有问题!\n");    }    *x = p->next->data;    q = p->next;    p->next = q->next;    free(q);}void ListRemove(SLNode *head, int x){    int i=0,n=0,flag=1;    SLNode *p = head;    while (flag != 0)    {        p = head;        i = 0;        while (p->next != NULL)        {            if (x == p->data)            {                ListDelete(head, i - 1, &n);                break;            }            i++;            p = p->next;        }        if (p->next == NULL)        {            flag = 0;        }    }    if (x == p->data)//最后一个节点中的数据与x相等    {        p = head;        while (p->next->next != NULL)        {            p = p->next;        }        p->next = NULL;    }}void ListSort(SLNode *head) //就地排序不开辟新的内存{    SLNode *curr, *pre, *p, *q;    p = head->next;     head->next = NULL;    while (p != NULL)    {        curr = head->next;        pre = head;        while (curr != NULL && curr->data <= p->data)        {            pre = curr;            curr = curr->next;        }        q = p;    //指针q指向待插入的的结点        p = p->next;           q->next = pre->next; //将结点q插入到结点pre之后        pre->next = q;    }}void print(SLNode *head){    SLNode *p;    p = head->next;    while (p != NULL)    {        printf("%d ", p->data);        p = p->next;    }}void Destory(SLNode **head)//销毁单链表中所有的结点{    SLNode *p1,*p;    p = *head;    while (p!=NULL)    {        p1 = p;        p = p->next;        free(p1);    }    *head = NULL; //为了避免出现野指针}int main(){    SLNode *list; int n=0,i=0;    ListIntiate(&list);    for (i = 0; i < 10; i++)    {        ListInsert(list, i,9-i);    }    //for (i = 0; i < 10; i++)    //{    //  ListInsert(list, i+10, i);    //}    printf("原始数据:\n");    print(list);    printf("\n");    printf("在第10个位置插入100:\n");    ListInsert(list, 10, 100);    print(list);    printf("\n");    printf("从小到大排序:\n");    ListSort(list);    print(list);    printf("\n");    printf(" 删除数字9:\n");    //ListDelete(list,9, &n);    ListRemove(list,9);    print(list);    printf("\n链表的长度 : %d \n",ListLength(list));    Destory(&list);    system("pause");    return 0;}

最新文章