数据结构链表的遍历问题
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->