首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数据结构链表的遍历有关问题

2013-06-25 
数据结构链表的遍历问题typedef struct Node{ char name[10] char sex[6] char No[11] int age struct

数据结构链表的遍历问题
typedef struct Node
{
 char name[10];
 char sex[6];
 char No[11];
 int age;
 struct Node *next;
}ListNode;
定义一个学生结构;
我现在要修改学生信息用p=p->next遍历,到最后p就只有一个信息了
求方法
[解决办法]
把第一个节点指针保存起来,称为pHead;这个不能动。然后定义一个指针p,让p=pHead,就可以了
[解决办法]
typedef struct Node
{
 char name[10];
 char sex[6];
 char No[11];
 int age;
 struct Node *next;
}ListNode;

声明一个永远都是指向链表的第一个结点的指针,在遍历的时候,就用一个临时变量遍历,那么就可以解决你的问题了!
当然如果你的链表是带头结点的链表,那就更简单了。
设L = (ListNode *)malloc(sizeof(ListNode)); // 这个作为头结点,
L->next = NULL; // 数据域可以不用

那么在遍历的时候,用一个临时变量p = L->next;
while (p)
{
  ...
  p = p->next;
}

这么写,可以看懂了吧!
[解决办法]
仅供参考

//假设带表头结点的单向链表头指针为head,试编写一个算法将值为5的结点插入到连接表的第k个结点前,并对该链表进行排序。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
struct NODE {
    int          data;
    struct NODE *next;
} H,*head,*p,*q;
int i,j,k,n,t;
int main() {
    srand(time(NULL));

    //填写头节点数据
    H.data=-1;
    H.next=NULL;
    head=&H;

    //创建10个节点的单链表
    p=head;
    for (i=0;i<10;i++) {
        q=(struct NODE *)malloc(sizeof(struct NODE));
        if (NULL==q) return 1;
        q->data=10+rand()%90;//填写10..99的随机值
        q->next=NULL;
        p->next=q;
        p=q;
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //将值为5的结点插入到单链表的第k个结点前
    k=3;
    n=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;


        }
        n++;
        if (k==n) {
            q=(struct NODE *)malloc(sizeof(struct NODE));
            if (NULL==q) return 1;
            q->data=5;
            q->next=p->next;
            p->next=q;
            break;
        }
        p=p->next;
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //从小到大排序
    for (p=head->next;p!=NULL && p->next!=NULL;p=p->next) {
        for (q=p->next;q!=NULL;q=q->next) {
            if (p->data > q->data) {
                t=p->data;p->data=q->data;q->data=t;
            }
        }
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //释放所有节点
    p=head->next;
    while (1) {
        if (NULL==p) {
            break;
        }
        q=p->next;
        free(p);
        p=q;
    }

    return 0;
}
//20->75->80->82->78->33->54->63->10->99->
//20->75->05->80->82->78->33->54->63->10->99->
//05->10->20->33->54->63->75->78->80->82->99->

热点排行