c语言 链表问题~~~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 链表问题~~~相关的知识,希望对你有一定的参考价值。
删除链表中的一个节点,输入n删除第n个。
#include<stdio.h>
#include<malloc.h>
int n;
struct student
int number;
char name[10];
struct student *next;
;
struct student *Create_List();
struct student *del(struct student *head,int num);
void Print_List(struct student *head);
void main()
int num;
struct student *head;
head=Create_List();
Print_List(head);
scanf("%d",&num);
head=del(head,num);
Print_List(head);
struct student *Create_List()
struct student *head=NULL,*p1,*p2;
int n=0;
p1=(struct student *)malloc(sizeof(struct student));
if(p1==NULL)
printf("内存分配失败");
return NULL;
scanf("%d,%s",&p1->number,&p1->name);
while(p1->number!=0)
n++;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(sizeof(struct student));
scanf("%d,%s",&p1->number,&p1->name);
p2->next=NULL;
free(p1);
p1=NULL;
return(head);
void Print_List(struct student *head)
struct student *p;
p=head;
if(head!=NULL)
do
printf("%d,%s\n",p->number,p->name);
p=p->next;
while(p!=NULL);
struct student *del(struct student *head,int num)
struct student *p1,*p2;
p1=head;
if(head==NULL)
printf("空");
if(p1->number!=num)
do
p2=p1;
p1=p1->next;
if(p1==NULL)
printf("没");
break;
while(p1->number!=n);
if(p1->number==num)
p2=p1->next;
p1=p1->next;
n=n-1;
do
p2=p1;
p1=p1->next;
while(p1!=NULL);
return(head);
最后个定义的函数错哪了?
# include <iostream>
# include "stdlib.h"
# include <string.h>
using namespace std;
# define NULL 0
typedef struct list
bool Flag;
char* data;
struct list* next;
list,*LIST;
LIST create()
//创建链表
LIST p;
p=(LIST)malloc(sizeof(list));
p->data=NULL;
return p;
void insert(LIST& head,char* str,bool Flag )
//把元素插入链表
LIST p;
p=(LIST)malloc(sizeof(list));
p->next=head;
p->data = (char *)malloc(sizeof(char)*15);
p->data = str;
head=p;
p->Flag=Flag;
void Delete(LIST& head,char* str)
//删除链表元素
LIST p,q;
p=head;
if(head==NULL)
cout<<"list NULL,erro\n";
else
for(;p->data!=str&&p->next!=NULL;p=p->next)
q=p;
if(p->next==NULL&&p->data!=str)
cout<<str<<" is not in the list\n";
else if(p->data==str)
if(p!=head)
q->next=p->next;
else
head=head->next;
delete p;
void SORT(LIST& head)
//链表排序
LIST p,q,s;
char* a=(char *)malloc(sizeof(char)*15);
if(head==NULL)
cout<<"list is NULL,you have no need to sort it\n";
else
for(p=head;p->data!=NULL;p=p->next)
for(q=p->next;q->data!=NULL;q=q->next)
if(p->Flag>q->Flag)
a=p->data;
p->data=q->data;
q->data=a;
p->Flag=0;
q->Flag=1;
for(p=head;p->data!=NULL;p=p->next)
for(q=p->next;q->data!=NULL;q=q->next)
if(p->Flag==q->Flag&&strcmp(p->data,q->data)>0)
a=p->data;
p->data=q->data;
q->data=a;
// delete a;
void print(LIST head)
//输出链表
LIST p;
p=head;
if(head==NULL)
cout<<"list NULL,quit\n";
else
cout<<"\nhere is the list\n";
for(;p->data!=NULL;p=p->next)
cout<<p->data<<'\t'<<p->Flag<<endl;
cout<<endl;
int main()
char str[15] = "12345678901234";
char str1[15] = "bbcd";
char str2[15] = "cbcd";
char str3[15] = "abgd";
char str4[15] = "babgd";
char str5[15] = "adwd";
char str6[15] = "cswd";
char str7[15] = "bdewgd";
LIST head=create();
insert(head,str ,0);
insert(head,str1,1);
insert(head,str2,0);
insert(head,str3,0);
insert(head,str4,1);
insert(head,str5,0);
insert(head,str6,0);
insert(head,str7,1);
print(head);
Delete(head,str);
SORT(head);
print(head);
return 0;
参考技术A 没分,还这么长,不看
我刚运行了一下看了看,你最后面好像是少了一个大括号,其他的没注意
c语言链表问题,有点抽象。
照着书本打了段代码,不知道哪里出错就是运行不了,代码如下:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
char name[10];
int num;
struct student *next;
*head,*p1,*p2,*p;
int n=0;
void main ()
creat();
shuchu();
void creat()
p1=(struct student *)malloc(sizeof(struct student));
p2=(struct student *)malloc(sizeof(struct student));
printf("输入姓名\n");
scanf("%s",p1->name);
printf("输入学号\n");
scanf("%d",&p1->num);
while(p1->name!=0)
n+=1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(sizeof(struct student));
printf("输入姓名\n");
scanf("%s",p1->name);
printf("输入学号\n");
scanf("%d",&p1->num);
void shuchu()
p=head;
while(p!=NULL)
printf("%s,%d",p->name,p->num);
p=p->next;
我用的是vs2012,错误提示如下:
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(13): warning C4013: “creat”未定义;假设外部返回 int
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(14): warning C4013: “shuchu”未定义;假设外部返回 int
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(18): error C2371: “creat”: 重定义;不同的基类型
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(41): error C2371: “shuchu”: 重定义;不同的基类型
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
还有许多链表的问题,我上面那个代码的那个if的else部分是啥意思。
最好每行都注释一下哈!谢谢!
改成下面这样就可以了
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
char name[10];
int num;
struct student *next;
*head,*p1,*p2,*p;
int n=0;
void creat()
p2=p1=(struct student *)malloc(sizeof(struct student)); //这里应该让p1,p2指向同一个地址
printf("输入姓名\\n");
scanf("%s",p1->name);
printf("输入学号\\n");
scanf("%d",&p1->num);
while(p1->num!=0)
n+=1;
if(n==1)//第一条记录为头记录
head=p1;//设置第一条记录为头记录
else
p2->next=p1;//如果不是第一条记录,把next指向上一次循环新建的内存地址
p2=p1;
p1=(struct student *)malloc(sizeof(struct student));
printf("输入姓名\\n");
scanf("%s",p1->name);
printf("输入学号\\n");
scanf("%d",&p1->num);
p2->next=NULL;//要加上这一句,表示最后一条记录
void shuchu()
p=head;
while(p!=NULL)
printf("%s , %d\\n",p->name,p->num);//加上\\n分行
p=p->next;
void main ()
creat();
shuchu();
system("pause");//该语句可防止运行结束时退出命令窗口,但多了提示“请按任意键继续...”这样才能看到屏幕内容
还有我把这程序完善了,可以到这里下载
p2=p1=(struct student *)malloc(sizeof(struct student)); //这里应该让p1,p2指向同一个地址
第一个问题:为啥这里要指向同一个地址呢?
第二个问题:代码中出现动态内存分配的函数malloc,为什么不需要用free()函数来释放内存呢?
第一个问题:其实从程序上看,p2相当于是指向链表最后一条记录的指针,p1相当于是临时记录,刚开始当然要指向同一个记录了!
第二个问题:因为你显示结束后,程序也就结束了,编译器会自动收回内存
以上是关于c语言 链表问题~~~的主要内容,如果未能解决你的问题,请参考以下文章