数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。相关的知识,希望对你有一定的参考价值。
一、单链表的建立有了动态内存分配的基础,要实现链表就不难了。
所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:
1、数据域:用来存储本身数据
2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。
例:
typedef strUCt node
char name[20];
struct node *link;
stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。
定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。
下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。
#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define N 10 /*N为人数*/
typedef struct node
char name[20];
struct node *link;
stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/
stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
int i; /*计数器*/
if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/
PRintf("不能分配内存空间!");
exit(0);
h->name[0]='\0'; /*把表头结点的数据域置空*/
h->link=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头结点*/
for(i=0;i<n;i++)
if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/
printf("不能分配内存空间!");
exit(0);
p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;
return(h);
main()
int number; /*保存人数的变量*/
stud *head; /*head是保存单链表的表头结点地址的指针*/
number=N;
head=creat(number); /*把所新建的单链表表头地址赋给head*/
这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注重,请尽量对分配是否成功进行检测。
引用自:www.knowsky.com/394874.html
谢谢采纳! 参考技术A 基于你的题目数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进...,
我们可以提供一份代码,适用于初学者的,
有别的要求也可以与我们联系,
联系我们需要提供你的问题和电子邮件,
有机会会帮你,肯定救急,
请用BaiduHi为我留言,
此回复针对所有来访者和需求者有效,
ES:\\C7A4B0425C8A2C6FAD8116214EE62CB9 参考技术B #include <stdio.h>
#include <stdlib.h>
struct node
int num;
struct node *next;
;
/*建立链表*/
struct node *creat(int n)
int x, i;
struct node *head, *p, *r;
head=(struct node*)malloc(sizeof(struct node));
r=head;
printf("请输入数字\r\n");
for(i=0; i<n; i++)
scanf("%d", &x);
p=(struct node*)malloc(sizeof(struct node));
p->num=x;
r->next=p;
r=p;
r->next=NULL;
return(head);
/*删除重复结点*/
void delet(struct node *head)
struct node *p, *q, *r;
p=head->next;
while(p!=NULL)
q=p;
while(q->next!=NULL)
r=q->next;
if(r->num==p->num)
if(r->next!=NULL)
q->next=r->next;
free(r);
else
q->next=NULL;
free(r);
else
q=r;
p=p->next;
/*排序*/
void sort(struct node *head)
struct node *p, *q, *small;
int temp;
for(p=head->next; p->next!=NULL; p=p->next)
small=p;
for(q=p->next; q!=NULL ;q=q->next)
if(q->num<small->num)
small=q;
if(small!=p)
temp=small->num;
small->num=p->num;
p->num=temp;
/*输出*/
void output(struct node *head)
struct node *pt;
pt=head->next;
while(pt!=NULL)
printf("%d\r\n", pt->num);
pt=pt->next;
void destroy(Node* head)
while (head)
Node* temp = head;
head = head->pstnext;
free(temp);
main()
int n;
struct node *head;
printf("输入数字的个数n\r\n");
scanf("%d", &n);
head=creat(n);
printf("输入的数字\r\n");
output(head);
delet(head);
printf("删除重复结点后输出数字\r\n");
output(head);
sort(head);
printf("排序后输出数字\r\n");
output(head);
destroy(head);
参考技术C 请独立完成作业 百度知道上所有的答案我都已经看过了
另:我是武斌本回答被提问者采纳
单链表的基本操作(c语言)——章节实验作业
单链表的基本操作(c语言)——章节实验作业
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<stdbool.h>
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node* next;
}Node, *LinkList;
void Show_meau() //菜单
{
printf("**********************************\\n");
printf(" WELCOME!\\n");
printf("\\n");
printf("\\t单链表的基本操作\\n\\n");
printf(" \\t 1.查询\\t 2.插入\\n\\n");
printf(" \\t 3.删除\\t 4.打印\\n\\n");
printf(" \\t 5.计数\\t 6.销毁\\n\\n");
printf(" \\t 7.退出\\t 8.建表\\n\\n");
printf("\\n");
printf(" 输入相关序号实现相关功能!\\n");
printf("**********************************\\n");
}
void InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
void Create_List(LinkList L) //尾插法
{
ElemType c;
Node* r, * s;
bool flag=true;
r = L;
printf("提示:输入$表示建表结束!\\n");
while (flag==true)
{
c = getchar();
if (c != \'$\')
{
s = (LinkList*)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = false;
r->next = NULL;
}
}
printf("建表完成!\\a");
Sleep(2000);
}
void Search(LinkList L)
{
int flag=1;
Node* p;
ElemType e;
getchar(); //吸收换行符
p = L->next;
printf("请输入要查找的值:");
e = getchar();
while (p != NULL)
{
if (p->data != e)
p = p->next;
else
{
printf("该地址为:%p\\n", p);
printf("输入0退出!\\n");
scanf("%d", &flag);
break;
}
}
if (flag == 0)
return;
printf("查无此值!\\a");
Sleep(2000);
}
void DispList(LinkList L)
{
int n;
LinkList p = L->next;
if (p == NULL)
{
printf("表为空!\\a");
Sleep(2000);
return;
}
printf("打印值为:\\n");
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\\n\\n");
while (1) {
printf("输入0退出打印!\\n");
scanf("%d", &n);
if (n == 0)
return;
else
printf("输入无效,请重新输入!\\n");
}
}
int ListLength(LinkList *L)
{
int n = 0;
LinkList p = L;
if (p->next == NULL)
{
printf("表为空!\\a\\n");
Sleep(2000);
return;
}
while (p->next != NULL)
{
n++;
p=p->next;
}
n--;
return n;
}
void Print_Length(LinkList L)
{
int n = 1;
while (1)
{
if (n == 1)
{
printf("表长为:%d\\n", ListLength(L));
printf("输入0退出打印!\\n");
scanf("%d", &n);
}
if (n == 0)
return;
}
}
void ListInsert(LinkList L)
{
int i,j=0;
ElemType e;
LinkList p = L, s;
if (p->next == NULL)
{
printf("表为空!\\a\\n");
Sleep(2000);
return;
}
printf("当前表长为:%d\\n", ListLength(L)); //注意指针L
while (1)
{
printf("请输入插入的位置:");
scanf("%d", &i);
if (i <= 0 || i > ListLength(L))
{
printf("输入错误!请重新输入!\\n");
}
else
break;
}
getchar();
printf("请输入插入的值:");
scanf("%c", &e);
while (j < i && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
{
printf("查无此值!\\n");
Sleep(2000);
return;
}
else
{
s = (LinkList*)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
printf("插入成功!\\a");
Sleep(2000);
}
}
void ListDelete(LinkList L)
{
int i, j = 0;
ElemType e;
LinkList p = L, q;
if (p->next == NULL)
{
printf("表为空!\\a\\n");
Sleep(2000);
return;
}
printf("当前表长为:%d\\n", ListLength(L)); //注意指针L
while (1)
{
printf("请输入删除值的位置:");
scanf("%d", &i);
if (i <= 0 || i > ListLength(L))
{
printf("输入错误!请重新输入!\\n");
}
else
break;
}
getchar();
while (j < i && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
{
printf("查无此值!\\n");
Sleep(2000);
return;
}
else
{
q = p->next;
if (p == NULL)
{
printf("查无此值!\\n");
Sleep(2000);
return;
}
e = q->data;
p->next = q->next;
free(q);
printf("删除成功!\\a");
Sleep(2000);
}
}
void DestroyList(LinkList L)
{
LinkList pre = L, p = L->next;
while (p != NULL) //逐一释放
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
printf("销毁成功!\\a");
Sleep(2000);
}
int main()
{
int n;
LinkList L; //头结点应为指针,因为调用DestroyList(L)时由手动释放(free())
InitList(&L); //注意栈区(自动释放)和堆区(手动释放)的销毁区别
while (1) {
system("cls"); //清屏函数
Show_meau();
printf("请输入1-8的数:");
scanf("%d", &n);
switch (n) {
case 1:
Search(L);
break;
case 2:
ListInsert(L);
break;
case 3:
ListDelete(L);
break;
case 4:
DispList(L);
break;
case 5:
Print_Length(L);
break;
case 6:
DestroyList(L); //注意栈和堆的销毁的区别
break;
case 7:
printf("........正在退出中........");
Sleep(3000);
system("cls");
printf("\\a退出成功!"),
exit(0);
break;
case 8:
Create_List(L);
break;
default:
printf("\\a输入错误!请重新输入(1—8)!"),
Sleep(2000);
break;
}
}
return 0;
}
以上是关于数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。的主要内容,如果未能解决你的问题,请参考以下文章