因此,我试图构建一个以城镇为节点、以边缘为距离的图形数据结构。我想为每个节点/位置创建一个邻接列表,并添加一个加权边。到目前为止,我已经创建了一个链表程序,询问用户他们想要多少节点。然后,用户可以在创建每个节点时为其命名,并打印出包含节点的链接列表。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
char city[20];
int weight;
struct node *next;
}node;
node *createLinkedList(int n);
void displayList(node *head);
int main()
{
int n = 0;
node *HEAD = NULL;
printf("nHow many nodes:t");
scanf("%d", &n);
HEAD = createLinkedList(n);
displayList(HEAD);
return 0;
}
node *createLinkedList(int n)
{
int i = 0;
node *head = NULL;
node *temp = NULL;
node *p = NULL;
for (i = 0; i < n; i++)
{
// create an individual node
temp = (node*)malloc(sizeof(node));
printf("nEnter the name of the city: ", i+1);
scanf("t%s",(temp->city));
temp->next = NULL;
if (head == NULL) //if list is currently empty, then make temp as first node
{
head = temp;
}
else
{
p = head;
while(p->next != NULL)
p = p->next;
p->next = temp;
}
}
return head;
}
void displayList(node *head)
{
node *p = head;
while(p != NULL)
{
printf("t%s->",p->city);
p = p->next;
}
}
现在,我希望用户指定每条边的权重,并将其打印出来。我自己也试过这样做,但没有用。我在顶部的结构中指定了一个权重int。如果有任何帮助,我将不胜感激。谢谢
您只需要将scanf
用作city
。对int
使用类型格式%d
。
printf("nEnter the name of the city %d: ", i+1);
scanf("t%19s",(temp->city));
printf("nEnter the the weight of the city %d: ", i+1);
scanf("t%d",&(temp->weight));
用于打印重量:
printf("weight = %dn",p->weight);
这是你想要的吗?
更新:
如果您想请求链表的子序列,可以在创建和显示函数中添加两个参数start
、end
。
node *createLinkedList(int n, int start, int end);
void displayList(node *head, int start, int end);
对于创建功能:
for (i = 0; i < n; i++) {
....
if (start <= i && i <= end) {
printf("nEnter the the weight of the city %d: ", i+1);
scanf("t%d",&(temp->weight));
}
...
}
对于显示功能,您可以使用列表中节点的顺序counter
:
int counter = 0;
while(p != NULL)
{
...
if (start <= counter && counter <= end) {
printf("n weight = %d n", p->weight);
}
...
counter++;
p = p->next;
}
然后,当您调用函数时,例如,您希望从第二个节点打印到第四个节点。
displayList(HEAD, 1, 3);
如果你不想添加start
和end
值,或者你想多次使用子序列,你可以在结构中添加一个参数int index
来跟踪每个节点的顺序。
typedef struct node
{
char city[20];
int weight;
int index
struct node *next;
}node;