链表

来源:互联网 发布:7.1声道耳机推荐 知乎 编辑:程序博客网 时间:2024/05/16 06:22
题目:设计算法将一个线性链表逆置,即将表(a1, a2, ……, an)逆置为(an, ……, a2, a1),要求逆置后的链表仍占用原来的存储空间。
#include <stdio.h>#include <malloc.h>typedef struct node{    char data;    struct node * next;}LinkList;//建立空表LinkList * initList(){    LinkList * head;    LinkList * p = (LinkList *)malloc(sizeof(LinkList));    p->next = NULL;    head = p;    return head;}//置表空void setListNull(LinkList * L){    LinkList * p = L->next;    while (p != NULL) {       // Delete(p);    }}//求表长int ListLength(LinkList * L){    int i = 0;    LinkList * p = L->next;    while(p != NULL)    {        i++;        p = p->next;    }    return i;}//按序号取元素char get(LinkList * L, int n){    if (n < 1 || n > ListLength(L))    {        printf("error:get");        return 0;    }    int i = 0;    LinkList * p = L->next;    while(p != NULL && i != n -1)    {        i++;        p = p->next;    }    return p->data;}//修改结点中的数据void set(LinkList * L, int n, char ch){    if (n < 1 || n > ListLength(L))    {        printf("error:set");        return ;    }    int i = 0;    LinkList * p = L->next;    while(p != NULL && i != n -1)    {        i++;        p = p->next;    }    p->data = ch;}//按值查找int ListLocate(LinkList * L, char ch){    LinkList * p = L->next;    int i = 1;    while (p != NULL)    {        if (p->data == ch)            return i;        p = p->next;        i++;    }    printf("error:ListLocate");    return 0;}//插入void insert(LinkList * L, int n, char ch){    LinkList * p = L;    LinkList * s = (LinkList *)malloc(sizeof(LinkList));    s->data = ch;    int i = 0;    while(p->next != NULL)    {        if (i == n-1)            break;        p = p->next;        i++;    }    s->next = p->next;    p->next = s;}//删除void Delete(LinkList * L, int n){    int i = 0;    LinkList * p = L;    while (p->next != NULL)    {        if (i == n -1)        {            break;        }        p = p->next;        i++;    }    LinkList * q = p->next;    p->next = q->next;    free(q);}void print(LinkList * L){    LinkList * p = L->next;    while(p != NULL)    {        printf("%c  ", p->data);        p = p->next;    }    printf("\n");}//逆置void ListInverse(LinkList * L){    int i, j;    LinkList * temp = (LinkList *)malloc(sizeof(LinkList));    for (i = 0, j = ListLength(L); i < j; i++, j--)    {        temp->data = get(L, i+1);        set(L, i+1, get(L, ListLength(L) - i));        set(L, ListLength(L) - i, temp->data);    }}int main(void){    LinkList * L = initList();    LinkList * S = initList();    int i;    char ch = 'A';    for (i = 1; i <= 26; ++i, ch++)    {        insert(L, i, ch);    }    print(L);    printf("第5个元素是:%c\n", get(L, 5));    printf("第26个元素是:%c\n", get(L, 26));    printf("第1个元素是:%c\n", get(L, 1));    printf("A在链表中的位置为:%d\n", ListLocate(L, 'A'));    printf("Z在链表中的位置为:%d\n", ListLocate(L, 'Z'));    Delete(L, 1);   //A    Delete(L, 25);  //Z    print(L);    printf("此时链表的长度为:%d\n", ListLength(L));    //逆置    ListInverse(L);    print(L);    ch  = '1';    for(i = 1; i <= 5; ++i, ch++)    {        insert(S, i, ch);    }    print(S);    ListInverse(S);    print(S);    return 0;}

这里写图片描述

0 0
原创粉丝点击