C语言链表创建问题

作者&投稿:班质 (若有异议请与网页底部的电邮联系)
c语言链表创建问题~

改成这样:
node* DuShiTI(int m) //读取试题,输入-1得出试题总数num
{
node *p=NULL;
FILE *fp;
FILE *fp = fopen("ChoiceQuestion.txt", "r");
if(fp==NULL)
{
printf("题库已损坏······");
exit(1);
}
if(p==NULL&&head==NULL)
{
p=(node*)malloc(sizeof(node));
head = p;
p = (node*)malloc(sizeof(node));
p->next=NULL;
head->next = p;
}
int b=1;
while(!feof(fp))
{
fscanf(fp,"%[^
]
%[^
]
%[^
]
%[^
]
%[^
]
%c
",p->question,p->obtionA,p->obtionB,p->obtionC,p->obtionD,&p->key);
if(b==m) { fclose(fp); return p; }
b++;
p->next=(node*)malloc(sizeof(node));
p = p->next;
p->next=NULL;
num++;
}
fclose(fp);
return NULL;
}

C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
int data;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("请输入第1个数据:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("请输入第%d个数据:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("链表创建成功!");
}
void main()
{
int n;
printf("请你输入链表的个数:");
scanf("%d",&n);
create(n);
}

单链表创建方法:
单链表的建立有头插法、尾插法两种方法。
1. 头插法
单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。
由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。
链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。
2. 尾插法
若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。

删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========LinkList CreatListR1(void){char ch[10];LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点ListNode *s,*pp,*r;r=head;r->next=NULL;printf("Input # to end "); //输入"#"代表输入结束printf("Please input Node_data:");scanf("%s",ch); //输入各结点的字符串 while(strcmp(ch,"#")!=0){if(head->next==NULL){s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);head->next=s;r=s;s->next=NULL;}else{pp=LocateNode(head,ch); //按值查找结点,返回结点指针if(pp==NULL) //如果没有重复的字符串,才插入到链表中{ s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);r->next=s;r=s;s->next=NULL;}printf("Input # to end ");printf("Please input Node_data:");scanf("%s",ch);}}return head; //返回头指针}//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========ListNode *LocateNode(LinkList head, char *key){ListNode *p=head->next; //从开始结点比较while(strcmp(p->data,key)!=0 && p) //直到p为NULL或p-> data为key止p=p->next; //扫描下一个结点return p; //若p=NULL则查找失败,否则p指向找到的值为key的结点}//==========删除带头结点的单链表中的指定结点=======void DeleteList(LinkList head,char *key){ListNode *p,*r,*q=head;p=LocateNode(head,key); //按key值查找结点的if

/*
Please input Node_data(# to QUIT!) : 三国演义
Please input Node_data(# to QUIT!) : 水浒
Please input Node_data(# to QUIT!) : 西游记
Please input Node_data(# to QUIT!) : 西厢记
Please input Node_data(# to QUIT!) : 桃花扇
Please input Node_data(# to QUIT!) : 洪秀全起义
Please input Node_data(# to QUIT!) : 太平天国
Please input Node_data(# to QUIT!) : #
三国演义, 水浒, 西游记, 西厢记, 桃花扇, 洪秀全起义, 太平天国,
Delete node (y/n):y
Please input Delete_data:水浒
三国演义, 西游记, 西厢记, 桃花扇, 洪秀全起义, 太平天国,
Press any key to continue
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct node { //定义结点
char data[81]; //结点的数据域为字符串
struct node *next; //结点的指针域
}*LinkList,*ListNode;

LinkList CreatList(); //函数,用尾插入法建立带头结点的单链表
ListNode LocateNode(LinkList head, char *s); //函数,按值查找结点
void DeleteNode(LinkList head, char *s); //函数,删除指定值的结点
void PrintList(LinkList head); //函数,打印链表中的所有值
void DeleteList(LinkList head); //函数,删除所有结点,释放内存

//==========主函数==============
void main() {
char s[81],num[10];
LinkList head;
head = CreatList(); //用尾插入法建立单链表,返回头指针
PrintList(head); //遍历链表输出其值
printf(" Delete node (y/n):"); //输入"y"或"n"去选择是否删除结点
scanf("%s",num);
if(strcmp(num,"y") == 0 || strcmp(num,"Y") == 0) {
printf("Please input Delete_data:");
scanf("%s",s); //输入要删除的字符串
DeleteNode(head,s);
PrintList(head);
}
DeleteList(head); //删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========
}

LinkList CreatList(void) {
char s[81];
LinkList head;
ListNode p,q;
head = p = (LinkList)malloc(sizeof(node)); //生成头结点
while(1) {
printf("Please input Node_data(# to QUIT!) : ");
scanf("%s",s); //输入各结点的字符串
if(strcmp(s,"#") == 0) break;
q = (LinkList)malloc(sizeof(node));
strcpy(q->data,s);
p->next = q;
p = q;
}
p->next = NULL;
return head;
}

//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode LocateNode(LinkList head, char *key) {
ListNode p = head->next; //从开始结点比较
while(strcmp(p->data,key) != 0) //直到p为NULL或p->data为key止
p = p->next; //扫描下一个结点
return p; //若p=NULL则查找失败,否则p指向找到的值为key的结点
}

//==========删除带头结点的单链表中的指定结点=======
void DeleteNode(LinkList head,char *key) {
ListNode q,p = head;
while(p->next != NULL) {
if(strcmp(p->next->data,key) == 0) {
q = p->next;
p->next = q->next;
free(q);
return;
}
else p = p->next;
}
printf("没找到数据为%s的结点。\n",p->data);
}

void PrintList(LinkList head) {
LinkList p = head->next; //从开始结点打印
while(p) {
printf("%s, ",p->data);
p = p->next;
}
printf("\n");
}

//==========删除所有结点,释放空间===========
void DeleteList(LinkList head) {
ListNode q,p = head;
while(p->next) {
q = p->next;
p->next = q->next;
free(q);
}
free(head);
}

c语言创建链表问题
答:结构体定义中的char *name;改成 char name[20]; //定义成数组,不要定义成指针,如果用指针,你需要在申请完成结点空间后,还要单独为name申请数据空间! 否则会造成内存溢出!

帮忙看看C语言链表创建错在哪里,新手求救,
答:include "stdio.h"#include "malloc.h"struct obj_list{ int label; struct obj_list* next_left; //错误在这里,要写全,下同 //指向上一个兄弟对象 struct obj_list* next_right; //指向下一个兄弟对象 unsigned int num_father; //父通讯录个数 unsigned int num_son...

C语言单向链表的创建,输入,插入和删除的实现
答:CreateList2(&La,a,5);//建立链表并用数组赋值 ListTraverse(La);//遍历链表 ListInsert(&La, 3, 100);//第三个位置插入100 ListTraverse(La);//遍历链表 ListDelete(&La,5,&x);//删除第五个元素,用x返回 ListTraverse(La);//遍历链表 DestroyList(&La);//销毁链表 } 这是我们刚学...

求写C语言 创建链表实例子。要最基本的 包括注释。
答:使用结构体变量作为链表中的结点,因为结构体变量成员可以是数值类型,字符类型,数组类型,也可以是指针类型,这样就可以使用指针类型成员来存放下一个结点的地址,使其它类型成员存放数据信息。在创建列表时要动态为链表分配空间,C语言的库函数提供了几种函数实现动态开辟存储单元。malloc()函数实现动态开辟...

求助一道C语言关于链表的问题,答对还有追加分数
答://新链表的头节点 Node* Insert(Node* students, Student* newStudent){ Node* pCurNode;//当前节点 Node* pNextNode;//下一节点 Node* pPrevNode;//上一节点 Node* pNode;Node* pNodeHead = students;//头节点 if(pNodeHead == NULL)//尚未有节点,创建一个头节点 { pNodeHead = (...

C语言的链表创建,程序如下,无错误,但无法显示.
答:再者,l理应来说是个链表指针头,因为不用来存储数据,所以没有必要申请空间,但是您令l也做为一个实际的链表表项,尽管并没有存储数据。您的目的如果仅仅是建立一个线性链表,每一个表项中存储a[N]的一个元素,显然程序不用这么复杂,pos是没有用的,inselem中的while(pos<=i)也是多余的,ins...

c语言链表的创建
答:current = (LIST *)malloc(sizeof(LIST)); //分配新的node地址 if(head == NULL) //判断head结点为空 head = current; //头结点为空,则此表为空表。else //头结点不为空,说明此表不为空,里面有结点 prev->next = current; //先前结点的next指针指向刚分配的结点的地址。

C语言实现链表创建插入删除,总是出错,怎么改正,急!!!
答:输出链表中的元素的时候最好用 ->next 指针来输出 另外,代码保存的路径最好不要有中文,避免发生未知错误

用c语言建立一个有序链表?
答:先按正常流程建立一个链表,再按照其某一个成员值进行冒泡排序(排序过程的交换,只交换链表指针以外的成员值)。演示代码如下:(演示代码链表20个节点,成员值为随机值)include<stdio.h> include<stdlib.h> include typedef struct slist { int a;struct slist *next;}SLIST;SLIST *init();//生...

【简单c语言】请教关于链表建立的问题
答:r指向的结构体是通过malloc在堆内存分配的,函数返回后,内存不会自动释放,需要使用free函数才能将指定的内存释放,所以返回后,r指向的地址仍有效。需要注意局部变量才是在栈内存里分配的。你搜索一下malloc可以了解到相关知识。